2017-06-21 75 views
0

如何用XSL(2.0)替换元素?XSL:按顺序替换元素

我有两个XML文件,结构是一样的,只有内容是不同的。

实施例:

file_EN.xml:

<root> 
    <book color="red" price="20€">My book</book> 
    <pen color="green" price="5€" owner="Michel">My pen</pen> 
    <book color="yellow" price="20€">My book 2</book> 
</root> 

file_FR.xml:

<root> 
    <book id="b1">Mon livre</book> 
    <pen id="p1">Mon stylo</pen> 
    <book id="b2">Mon livre 2</book> 
</root> 

欲更换由file_EN.xml元件所有file_FR.xml元素,预期的结果是:

<root> 
    <book color="red" price="20€">Mon livre</book> 
    <pen color="green" price="5€" owner="Michel">Mon stylo</pen> 
    <book color="yellow" price="20€">Mon livre 2</book> 
</root> 
+0

什么逻辑黄皮书ID为'b2'链接到这本书吗?它只是文件中的位置吗? –

+0

不,这是一个ID,你可以忽略它 – Valeriane

+0

恐怕不能回答我的问题。 –

回答

1

我会做

<xsl:for-each select="root/*"> 
    <xsl:variable name="p" select="position()" as="xs:integer"/> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:value-of select="doc('file_FR.xml')/root/*[$p]"/> 
    </xsl:copy> 
</xsl:for-each> 
1

假设你想在同一位置中的其他文件中的文本,你可以按如下方式使用XSLT 3.0和xsl:evaluatepath()全部更换叶元素的文本节点:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:param name="doc2-uri" as="xs:string" select="'file_FR.xml'"/> 
    <xsl:param name="doc2" select="doc($doc2-uri)"/> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:template match="*[not(*)]/text()"> 
     <xsl:evaluate context-item="$doc2" xpath="path()"/> 
    </xsl:template> 

</xsl:stylesheet> 

XSLT 3.0和xsl:evaluate中支持Saxon 9.7/9.8 PE和EE以及Altova XMLSpy和Raptor的当前版本。

+0

我使用的不是XSLT 3 :( – Valeriane

+1

@Valeriane,好吧,您还没有在您的问题中使用过任何XSLT,也没有使用标签限制版本或你的文本,所以它是值得展示一种XSLT 3.0允许的新方式。 –

+0

正确!我修改了我的问题 – Valeriane