我试图在同一个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。
答案 0 :(得分:2)
从一个特定old/xref
的上下文开始,您可以使用
<xsl:variable name="matching" select="../../new/xref[. = current()]"/>
在方括号中,.
是您正在测试的new/xref
,current()
是您开始的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
元素放在一起,用空格分隔。