0

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

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

节点集#1

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

节点集#2

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

1 回答 1

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"/>

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

<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>
于 2013-02-01T17:16:47.763 回答