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

27

这是我的源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。

我的方法看起来像这样:

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

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

提前感谢任何提示!

5个回答

49
只需删除Data后面的斜杠并在其前面添加根路径即可:
<xsl:variable name="myVarA" select="/root/DataSet/Data[@Value1='2']/@Value2"/>

@Andrew Hare:已经更正。感谢Quassnoi的详细解释,我在发布第一个修订版后立即失去了连接。 - phihag

4

您的xpath存在两个问题-首先,您需要从Data之后删除子选择器,就像phihag提到的那样。另外,您忘记在xpath中包含root。以下是您需要执行的操作:

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

1
注意:在xpath的开头使用//会比较占用CPU资源,因为它会搜索每个节点以寻找匹配项。使用更具体的路径,例如/root/DataSet,将创建一个更快的查询。

6
由于这并不回答问题,因此应该在原始问题下发布评论。 - james.garriss

1

试试这个

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

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


0
我会通过创建一个指向具有Value1正确值的节点的变量,然后引用t来完成它。
<xsl:variable name="myVarANode" select="root//DataSet/Data[@Value1='2']" />
<xsl:value-of select="$myVarANode/@Value2"/>

其他所有人的答案也是正确的 - 实际上更正确,因为我没有注意到您XPATH中额外的斜杠可能会搞砸事情。不过,这种方法也可以使用,并且可能适用于不同的内容,因此将此方法保留在工具箱中。


1、1, 2, 3 这些东西是假设的吗? 2、我有一个<cd><album>专辑名称</album><artist>艺术家A</artist><artist>艺术家B></artist></cd>,我正在尝试选择所有兄弟艺术家,并将它们与连接到专辑的中间表联系起来,而不会从我的庞大数据库中获得重复的艺术家。你有什么想法? - Wolfpack'08

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接