Xsl找到所有具有名称的节点,如其他节点的值

时间:2010-08-31 12:53:47

标签: xml xslt

我如何使用Xsl查找所有具有其他节点值的节点 像这样:

 <root>
    <data1>
      <subdata1>
        ...
        <selectThese></selectThese>
        ...
      </subdata1>

    </data1>
    <nodesetFind>
      <node1>selectThese</node1>
    </nodesetFind>
  </root>

结果:<selectThese></selectThese>

3 个答案:

答案 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>