2013-11-20 48 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