XSLT - 如何按属性选择XML属性?

时间:2009-02-12 14:05:46

标签: xml xslt xpath xml-attribute

这是我的源xml的结构:

<root>
<DataSet Value="A">
<Data Value1="1" Value2="anythingA1" />
<Data Value1="2" Value2="anythingA2" />
<Data Value1="3" Value2="anythingA3" />
<Data Value1="4" Value2="anythingA4" />
<Data Value1="5" Value2="anythingA5" />
</DataSet>
</root>

我喜欢创建一些变量,例如从所有的Value1 =“2”和所有的Value1 =“5”应该导致myVar1与anythingA2和myVar2与anythingA5

我的approch看起来像这样

<xsl:variable name="myVarA" select="/DataSet/Data/[@Value1='2']/@Value2" />

但当然不起作用,因为Value2不是Value1的孩子。

提前感谢任何提示!

5 个答案:

答案 0 :(得分:47)

只需删除Data之后的斜杠并添加根:

<xsl:variable name="myVarA" select="/root/DataSet/Data[@Value1='2']/@Value2"/>

答案 1 :(得分:4)

你的xpath存在两个问题 - 首先你需要在像{phihag提到的Data之后删除子选择器。此外,您忘记在xpath中包含root。这是你想要做的:

select="/root/DataSet/Data[@Value1='2']/@Value2"

答案 2 :(得分:1)

试试这个

xsl:variable name="myVarA" select="//DataSet/Data[@Value1='2']/@Value2" />

'//'将在任何深度搜索DataSet

答案 3 :(得分:1)

注意:在xpath的开头使用//有点CPU密集型 - 它会搜索每个节点以进行匹配。使用更具体的路径,例如/ root / DataSet将创建更快的查询。

答案 4 :(得分:0)

我会通过创建一个变量来实现它,该变量指向Value1中具有适当值的节点,然后引用t

<xsl:variable name="myVarANode" select="root//DataSet/Data[@Value1='2']" />
<xsl:value-of select="$myVarANode/@Value2"/>

其他人的答案也是对的 - 实际上更正确,因为我没有注意到你的XPATH中的额外斜线会搞砸了。尽管如此,这也可行,并且可能适用于不同的事情,因此请将此方法保留在工具箱中。