通过 XSLT/Xpath 比较一系列元素并在匹配时替换

Comparing a sequence of elements and replacing on match via XSLT/Xpath

我正在尝试在同一 XML 文档中的两个子元素之间进行某种交叉。

<links>
 <old>
   <xref linkend="zzzzz">/chapter/subchapter[1]/section[2]/@id</xref>
   <xref linkend="aaaaa">/chapter/section[1]/@id</xref>
 </old>
 <new>
   <xref linkend="xxxxx">/chapter/subchapter[1]/section[2]/@id</xref>
   <xref linkend="sssss">/chapter/@id</xref>
 </new>
</links>

每当 new/xref 和 old/xref 中的字符串路径匹配时,我想加入这两个元素并创建如下输出:

<matches>
  <match old-linkend='zzzzz' new-linkend='xxxxx'>/chapter/subchapter[1]/section[2]/@id</match>
</matches>

这是我第一次尝试比较序列,所以我有点迷茫。我在 Saxon 中使用 XSLT 2.0。

从一个特定 old/xref 的上下文开始,您可以使用

检查匹配的新上下文
<xsl:variable name="matching" select="../../new/xref[. = current()]"/>

在方括号中,. 是您正在测试的 new/xrefcurrent() 是您开始的 old/xref。检查此序列是否为空会告诉您是否存在匹配项。

<xsl:if test="$matching">
  <match old-linkend="{@linkend}" new-linkend="{$matching/@linkend}">
    <xsl:value-of select="." />
  </match>
</xsl:if>

如果有多个 new/xref 与此 old/xref 匹配,则 new-linkend 属性值模板受 rules for constructing simple content 的约束,它将连接 linkend来自 all 个匹配 new/xref 元素的值,用空格分隔。