XSL - 比较两个节点集并输出不匹配

时间:2013-02-01 16:44:20

标签: xml xslt

我有两个节点集,如果没有匹配,我想输出(a)节点的值。逻辑如下:

如果节点集#1中属性“term”的任何值与节点集#2中的“键”属性的任何值都不匹配,则从节点集输出“term”值#1。我该怎么做?

节点集#1

    <stuff term="foo" />
    <stuff term="bar" />
    <stuff term="test" />

节点集#2

    <other key="time" />
    <other key="rack" />
    <other key="foo" />
    <other key="fast" />

1 个答案:

答案 0 :(得分:1)

假设您的XML看起来像这样

<record>
   <stuff>
      <stuff term="foo"/>
      <stuff term="bar"/>
      <stuff term="test"/>
   </stuff>
   <other>
      <other key="time"/>
      <other key="rack"/>
      <other key="foo"/>
      <other key="fast"/>
   </other>
</record>

您可以设置一个键,根据属性

来查找其他元素

<xsl:key name="other" match="other/*" use="@key"/>

然后,要选择没有匹配其他元素的内容元素,您可以使用这样的键

<xsl:apply-templates select="stuff/*[not(key('other', @term))]"/>

尝试以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>
   <xsl:key name="other" match="other/*" use="@key"/>

   <xsl:template match="/*">
      <xsl:apply-templates select="stuff/*[not(key('other', @term))]"/>
   </xsl:template>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

当应用于上述XML时,输出如下

<stuff term="bar"></stuff>
<stuff term="test"></stuff>