2017-06-21 61 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