假设我有以下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将是最好的。
答案 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>