我如何使用Xsl查找所有具有其他节点值的节点 像这样:
<root>
<data1>
<subdata1>
...
<selectThese></selectThese>
...
</subdata1>
</data1>
<nodesetFind>
<node1>selectThese</node1>
</nodesetFind>
</root>
结果:<selectThese></selectThese>
答案 0 :(得分:3)
使用强>:
/*/data1//*[name() = /*/nodesetFind/*]
在XSLT转换中证明:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="/*/data1//*[name() = /*/nodesetFind/*]"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<root>
<data1>
<subdata1>
...
<selectThese></selectThese>
...
</subdata1>
</data1>
<nodesetFind>
<node1>selectThese</node1>
</nodesetFind>
</root>
产生了想要的正确结果:
<selectThese></selectThese>
答案 1 :(得分:3)
另一种方式,这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="kDataByName" match="*[ancestor::data1]" use="name()"/>
<xsl:template match="/">
<xsl:copy-of select="key('kDataByName',/root/nodesetFind/node1)"/>
</xsl:template>
</xsl:stylesheet>
输出:
<selectThese></selectThese>
注意:这是XSLT唯一的解决方案(Dimitre的答案是一般的XPath,然后是XSLT),因为使用了fn:key
。因此,您需要声明用于使用此表达式的键来选择所需的节点:
key('kDataByName',/root/nodesetFind/node1)
答案 2 :(得分:1)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<xsl:variable name="find" select="//nodesetFind/node1" />
<root>
<xsl:for-each select="//*[name()=$find]">
<xsl:copy-of select="." />
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>