XSLT - 匹配其中包含某个节点的节点(如jQuery“:has”)

时间:2009-03-05 14:34:52

标签: xml xslt xpath

假设我有以下XML文件

<a id="123">
   <b type="foo" value="1" />
   <b type="baz" value="1" />
</a>
<a id="789">
  <b type="bar" value="12" />
</a>
<a id="999">
   <b type="foo", value="2" />
</a>

我想获得所有'a'节点的列表,这些节点的'b'子节点的类型=“foo”,值=“1”。您可以使用“:has”选择器在jQuery中执行类似的操作。

为了记录,我打算在命令行上使用xmlstarlet(但我并没有按照这种方式结婚),所以以这种方式运行的xslt将是最好的。

4 个答案:

答案 0 :(得分:6)

类似的东西:

a[b[@type='foo'][@value='1']]

应该做的伎俩

答案 1 :(得分:2)

这可以使用单个XPath表达式完成,如Gizmo的答案所述。

因为问题是针对XSLT的,所以这是一个有效的XSLT解决方案,使用密钥:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
<!--                                      --> 
 <xsl:key name="kAByBTypeVal" 
  match="a"
  use="concat(b/@type,'+',b/@value)"/>
<!--                                      -->       
    <xsl:template match="/">
      <xsl:copy-of select=
       "key('kAByBTypeVal', 'bar+12')"/>
    </xsl:template>
</xsl:stylesheet>

对此XML文档应用上述转换时

<t>
    <a id="123">
        <b type="foo" value="1" />
        <b type="baz" value="1" />
    </a>
    <a id="789">
        <b type="bar" value="12" />
    </a>
    <a id="999">
        <b type="foo" value="2" />
    </a>
</t>

产生了正确的结果

<a id="789">
  <b type="bar" value="12"/>
</a>

答案 2 :(得分:0)

我认为这将是:/ b [@ type ='foo'和@ value = 1] / parent :: a

答案 3 :(得分:-1)

<xsl:variable name="nodeList" select="a[b[@type='foo' and @value=1]]"/>

<xsl:for-each select="$nodeList">
    <xsl:value-of select="."/>
</xsl:for-each>