2013-11-20 47 views
-3

任何人都可以幫忙嗎?我有以下XML:用XSLT提取所有屬性值

<root> 
<tag1 attr="something1"> 
    <tag21 attr="something21"></tag21> 
    <tag321 attr="something321"></tag321> 
</tag1> 
<tag144 attr="something15"> 
    <tag21 attr="something215"></tag21> 
    <tag321 attr="something32156"></tag321> 
</tag144> 
</root> 

Basicly我需要attr的每個值就像寫在新的XML:

something1 
somethin21 
something321 
something15 
something215 
something 32156 

我什麼都試過,但不能使它工作像我將需要。還要注意,attr可以出現在XML中的任何地方(不僅僅是XML結構和上面的節點)。

感謝您的幫助, Eoglasi

+0

選擇=「// @ *」應該這樣做 –

回答

2

這將做到這一點:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="//@attr" /> 
    </xsl:template> 

    <xsl:template match="@attr"> 
    <xsl:value-of select="concat(., '&#xA;')"/> 
    </xsl:template> 

</xsl:stylesheet> 

當你的樣品輸入運行,其結果是:

something1 
something21 
something321 
something15 
something215 
something32156 

這裏是一個XSLT使用分組只顯示不同的值。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:key name="kAttr" match="@attr" use="." /> 

    <xsl:template match="/"> 
    <xsl:apply-templates 
     select="//@attr[generate-id() = 
         generate-id(key('kAttr', .)[1])] " /> 
    </xsl:template> 

    <xsl:template match="@attr"> 
    <xsl:value-of select="concat(., '&#xA;')"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

這是很好的答案,但現在我發現我有重複的值。它可以像上面那樣完成,但是爲了移除重複的值,只有一個唯一的值會被導入?感謝您的幫助,Eoglasi – eoglasi

+0

@eoglasi我知道這是一個老問題,但我只是注意到了您的評論。我添加了一個僅顯示唯一值的XSLT。 – JLRishe