使用XSLT选择另一个节点中不存在的所有元素

时间:2012-04-26 19:32:32

标签: xml xslt xpath

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

<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,因为它们没有在所选用户节点下列出..

2 个答案:

答案 0 :(得分: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)]"/>

答案 1 :(得分:2)

您可以使用此xpath:

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

得到“约翰”和“娄”。如果你指定你想要获得什么样的输出,我可以添加一个XSLT示例。