这是我的源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的孩子。
提前感谢任何提示!
答案 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中的额外斜线会搞砸了。尽管如此,这也可行,并且可能适用于不同的事情,因此请将此方法保留在工具箱中。