我正在尝试获取节点属性的名称,该节点的子节点具有需要匹配的2个属性。我写这篇文章听起来很奇怪,但我认为不应该这么做。
我正在使用XLST通过此代码解决此问题。
<xsl:template match="/">
<xsl:apply-templates select="/parent[child[@A>10 and B='something']]/@NAME"/>
</xsl:template>
<xsl:template match="//@NAME">
<p><xsl:value-of select="concat(., ' ')"/></p>
</xsl:template>
</xsl:stylesheet>
但不幸的是我无法让它发挥作用。对于这个问题,现在已经尝试了不同的方法。
XLS看起来像这样:
<parent NAME="a name">
<child A='999' B='something'>
</child>
</parent>
<parent NAME="a name2">
<child A='1' B='something'>
</child>
</parent>
谢谢!
答案 0 :(得分:2)
你的第一个表达方式实际上并不遥远,但应该是这个......
<xsl:apply-templates select="//parent[child[@A>10 and @B='something']]/@NAME"/>
您当前的表达式以/parent
开头,如果它是XML的根元素,则只会选择parent
。 XML文档只能有一个根元素,并且当您的XML片段显示多个parent
时,这表明它们有一个包含它们的父元素。
执行//parent
,但选择parent
个元素,无论它们在XML中的位置。
此外,您的表达式为某个属性选择了B
(对于一个元素)而不是@B
。
所以,你的完整XSLT看起来像这样
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:apply-templates select="//parent[child[@A>10 and @B='something']]/@NAME"/>
</xsl:template>
<xsl:template match="@NAME">
<p><xsl:value-of select="concat(., ' ')"/></p>
</xsl:template>
</xsl:stylesheet>
请注意,//
的模板匹配中无需使用@NAME
。
答案 1 :(得分:1)
这将为您提供parent
'name(//parent[./child[@A and @B]]/@*)'
如果您只想要第一个(或第n个属性),只需按顺序添加索引,如下所示:
'name(//parent[./child[@A and @A]]/@*[1])'