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

时间:2015-02-23 17:20:27

标签: xml xslt xpath xslt-2.0

我试图在同一个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>

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

1 个答案:

答案 0 :(得分:2)

从一个特定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的{​​{1}}值 all 将匹配的new/xref元素放在一起,用空格分隔。