子节点在Xpath中具有特定值属性的节点的属性

时间:2016-12-19 20:48:13

标签: xml xslt xpath

我正在尝试获取节点属性的名称,该节点的子节点具有需要匹配的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>

谢谢!

2 个答案:

答案 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])'