给定两个数据集(假设它们是有效的节点集(:
$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,以从$second
中不存在的<value/>
中精确选择CC_3节点?
我最接近的是,肯定的是
$first/value[not(@id = $second/value/@id)]
但是,这显然是不正确的。我的下一个想法是:
$first/value[not($second/value[@id = current()/@id])]
也明显不正确,因为current()
引用上下文节点,而不是当前value
节点。
是否有单行方法不需要丑陋的字符串操纵来制作此过滤器?是否有更好的通用XSLT解决方案?
谢谢
我不确定您的问题是什么。使用此输入:
<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>
完全按照您的意愿,完全使用了您一直在使用的代码。