通过 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/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
来自 all 个匹配 new/xref
元素的值,用空格分隔。
我正在尝试在同一 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/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
来自 all 个匹配 new/xref
元素的值,用空格分隔。