【发布时间】:2020-10-20 12:13:20
【问题描述】:
我有一个 XML 输入,它是两个 xml 的合并格式:
<DATA>
<RECORDS1>
<RECORD>
<id>11</id>
<value>123</value>
</RECORD>
<RECORD>
<id>33</id>
<value>321</value>
</RECORD>
<RECORD>
<id>55</id>
<value>121113</value>
</RECORD>
...
</RECORDS1>
<RECORDS2>
<RECORD>
<id>11</id>
<value>123</value>
</RECORD>
<RECORD>
<id>33</id>
<value>323</value>
</RECORD>
<RECORD>
<id>44</id>
<value>12333</value>
</RECORD>
...
</RECORDS2>
我需要在输出中复制 RECORDS1 中提供的记录:
- RECORDS1 中的记录在 RECORDS2 中不存在
- RECORDS1 中的记录存在于 RECORDS2 中,但值不同
另外,如果输出可以扩展,例如使用一个额外的字段,其值为 NEW(当不存在时)作为 CHANGE(当存在但值不同时)
输出
<DATA>
<RECORDS>
<RECORD>
<id>33</id>
<value>321</value>
<kind>Change</kind>
</RECORD>
<RECORD>
<id>55</id>
<value>121113</value>
<kind>New</kind>
</RECORD>
...
</RECORDS>
我已经应用了 FOR 循环,但由于 xslt 中的变量无法重置,因此它不起作用。
有什么想法吗?
【问题讨论】:
-
这听起来像是任何分组问题的变体,因此 XSLT 2 或更高版本中的常用方法
for-each-group或 XSLT 1 中的 Muenchian 分组应该会有所帮助。或者也许只使用一个键并检查是否缺少匹配项就足以复制您想要的节点。 -
任何参考资料?
-
好吧,首先告诉我们您使用的是哪个 XSLT 版本。通常,您可以使用例如声明密钥
<xsl:key name="rec2" match="RECORDS2/RECORD" use="id"/>然后只处理RECORDS1/RECORD[not(key('rec2', id))]。如果value也很重要,则组合键值,在 XSLT 3 中最简单的方法是使用<xsl:key name="rec2" match="RECORDS2/RECORD" composite="yes" use="id, value"/>,然后仅处理RECORDS1/RECORD[not(key('rec2', (id, value))]。通过您的编辑来区分不匹配和不同的值,您也许可以再寻找一个键。 -
我使用的是 xslt 版本 2
-
试试键,如果我没记错的话,XSLT 2 不支持
composite,但您可以使用两个键,也可以在use="concat(id, '|', value)"中连接两个值。