以特定方式使用XSLT合并XML文件

时间:2017-09-13 09:12:28

标签: xml xslt

我想合并多个XML文件,我在网上搜索没有人这样做,所以......

让我解释一下;

这是我的第一个xml:

<?xml version = "1.0" ?>
<racine>
    <info>
        <price>50</price>
        <physic>
            <color>blue</color>
            <height>1</height>
        </physic>
    </info>
</racine>

第二个:

<?xml version = "1.0" ?>
<racine>
    <info>
        <price>100</price>
        <physic>
            <color>black</color>
            <height>2</height>
        </physic>
    </info>
</racine>

我想要这个输出;

<?xml version = "1.0" ?>
<racine>
    <info>
        <price>50</price>
        <physic>
            <color>blue</color>
            <height>1</height>
        </physic>
    </info>
    <info>
        <price>100</price>
        <physic>
            <color>black</color>
            <height>2</height>
        </physic>
    </info>
</racine>

你有任何解决方案/想法吗?

谢谢,祝你有愉快的一天!

2 个答案:

答案 0 :(得分:1)

考虑到上面共享的输入XML,可以使用在第一个输入XML上应用的以下XSL来合并它们。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" />
    <xsl:param name="fileName" select="document('2.xml')" />
    <!-- identity transform -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="racine">
        <xsl:copy>
            <!-- retain existing nodes of 1.xml as is -->
            <xsl:apply-templates select="@* | node()" />
            <!-- copy required nodes from 2.xml -->
            <xsl:apply-templates select="$fileName/racine/*" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出

<racine>
    <info>
        <price>50</price>
        <physic>
            <color>blue</color>
            <height>1</height>
        </physic>
    </info>
    <info>
        <price>100</price>
        <physic>
            <color>black</color>
            <height>2</height>
        </physic>
    </info>
</racine>

答案 1 :(得分:0)

它几乎可以作为单行完成:

<xsl:template name="main">
  <racine>
   <xsl:copy-of select="(doc('doc1.xml')|doc('doc2.xml'))/racine/*"/>
  </racine>
</xsl:template>