给定两个数据集(假设它们是有效的节点集):
$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解决方案?
由于
答案 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>
正如您似乎想要的那样,正是您使用过的代码。