2017-06-21 13 views
0

要素をXSL(2.0)で置き換える方法を教えてください。XSL:要素を注文順に置き換える

私は2つの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

をしますか?それは文書内の単なる位置ですか? –

+0

いいえ、それはIDです、あなたは無視することができます – Valeriane

+0

私は私の質問に答えるのではないかと恐れています。 –

答えて

1

私はID `b2`で予約する黄色の本を結ぶどのようなロジック

<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
<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がでサポートされています:あなたは次のようにあなたがXSLT 3.0とxsl:evaluatepath()を使用することができ、他のファイル内の同じ位置からテキストがすべてのリーフ要素のテキストノードを交換したいと仮定すると、 Altova XMLSpyとRaptorの9.7/9.8のPEとEEと最新バージョン

+0

私はXSLT 3を使用していません: – Valeriane

+1

@Valeriane、あなたの質問では全くXSLTを使用していませんでした。あなたのテキストはXSLT 3.0が許す新しい方法を示す価値がありました。 –

+0

right!私の質問を変更しました。 – Valeriane

関連する問題