2015-02-23 58 views
0

我试图在同一个XML文档中的两个子元素之间进行排序的交集。比较一系列元素并通过XSLT/Xpath替换匹配

<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> 

每当有新的/外部参照老/外部参照的路径字符串之间的匹配,我想加入的两个元素,创造一个像这样的输出:

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

这是我第一次尝试比较序列,所以我有点迷路。我在撒克逊使用XSLT 2.0。

+0

您可以在old/xref上做一个选择匹配,然后使用xsl:if如/ new/xref [position()]。你可能必须去父母,这取决于你如何做你的匹配,即../新/外部参照[位置()]。 – 2015-02-23 17:28:35

回答

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/xrefnew-linkend属性值模板是受rules for constructing simple content,将从所有匹配new/xref元件一起串联的linkend值,用空格分开。

+0

如果有多个比赛怎么办?我有点期待某种模板比赛。 – 2015-02-23 18:07:13

+1

@PhilipStuyck,因为这是XSLT 2.0,你会得到所有匹配的'linkend'值空间分隔。如果它是XSLT 1.0,那么你只能得到其中的一个(按文档顺序排列第一)。 – 2015-02-23 18:27:07