XSL:按顺序替换元素

时间:2017-06-21 12:42:02

标签: xml xslt

如何用XSL(2.0)替换元素?

我有两个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>

2 个答案:

答案 0 :(得分:1)

假设您想要使用另一个文件中相同位置的文本替换所有叶元素的文本节点,您可以使用XSLT 3.0和xsl:evaluate以及path(),如下所示:

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

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

答案 1 :(得分: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>