1

我想选择另一个节点中不存在的所有元素。

<root>
  <users>
    <array>
      <name>John</name>
      <age>30</age>
    </array>
    <array>
      <name>Joe</name>
      <age>30</age>
    </array>
    <array>
      <name>Lou</name>
      <age>30</age>
    </array>
  </users>
  <selected_users>
    <name>Joe</name>
    <age>30</age>
  </selected_users>
</root>

所以我从这个列表中想要的是 John 和 Lou,因为他们没有在选定的用户节点下列出。

4

2 回答 2

4

这是一个简短的方法来做到这一点:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="text"/>

    <xsl:template match="users/array/name[not(.=/*/selected_users/name)]">
        <xsl:value-of select="concat(., ' ')"/>
    </xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时:

<root>
    <users>
        <array>
            <name>John</name>
            <age>30</age>
        </array>
        <array>
            <name>Joe</name>
            <age>30</age>
        </array>
        <array>
            <name>Lou</name>
            <age>30</age>
        </array>
    </users>
    <selected_users>
        <name>Joe</name>
        <age>30</age>
    </selected_users>
</root>

产生了想要的正确结果:

John Lou 

注意

如果要name在变量中获取所需元素,请使用:

    <xsl:variable name="vSomeName" select=
"/*/users/array/name[not(.=/*/selected_users/name)]"/>
于 2012-04-27T01:34:48.550 回答
2

您可以使用此 xpath:

/*/users/array/name[not(.=/*/selected_users/name)]

得到“John”和“Lou”。如果您指定要获得的输出类型,我可以添加一个 XSLT 示例。

于 2012-04-26T19:36:59.200 回答