XSLT 1.0 - 获取不在第二组中的值集

时间:2017-04-27 19:59:20

标签: xslt xslt-1.0

给定两个数据集(假设它们是有效的节点集):

$first正在

<values>
  <value id="1"/>
  <value id="2"/>
  <value id="3"/>
</values>

$second正在

<values>
  <value id="3"/>
  <value id="4"/>
  <value id="5"/>
</values>

我是否能够在XSLT中构建一个XPath,它准确选择<value/>$first$second不存在的$first/value[not(@id = $second/value/@id)] 个节点?

我最接近的是,最小的想法是

$first/value[not($second/value[@id = current()/@id])]

然而,这显然是不正确的。我的下一个想法是:

current()

这也明显不正确,因为value引用了上下文节点,而不是当前的scanf节点。

是否有单线方法不需要丑陋的字符串操作来制作此过滤器?是否有更好的更通用的XSLT解决方案?

由于

1 个答案:

答案 0 :(得分:1)

我不确定你的问题是什么。有了这个输入:

<xml>
    <first>
        <values>
          <value id="1"/>
          <value id="2"/>
          <value id="3"/>
        </values>
    </first>
    <second>
        <values>
          <value id="3"/>
          <value id="4"/>
          <value id="5"/>
        </values>
    </second>
</xml>

此样式表

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

    <xsl:variable name="first" select="/*/first/values" />
    <xsl:variable name="second" select="/*/second/values" />

    <xsl:template match="/">
        <output>
            <same>
                <xsl:copy-of select="$first/value[@id = $second/value/@id]" />
            </same>
            <different>
                <xsl:copy-of select="$first/value[not(@id = $second/value/@id)]" />
            </different>
        </output>
    </xsl:template>
</xsl:transform>

给出

<output>
   <same>
      <value id="3"/>
   </same>
   <different>
      <value id="1"/>
      <value id="2"/>
   </different>
</output>

正如您似乎想要的那样,正是您使用过的代码。