使用XSL将2个XML文件合并为1个

时间:2015-02-24 10:25:45

标签: xml xslt

我无法找到合适的示例将2个XML文件合并为1,如下所示:

movies.xml

<movies>
    <movie>
        <name>ET</name>
        <director>Steven Spielberg</director>
        <date>15 January 2000</date>
    </movie>
    <movie>
        <name>The Neverending Story</name>
        <director>Steven Spielberg</director>
        <date>4 November 2006</date>
    </movie>
</movies>

directos.xml

<directors>
    <director>
        <name>Steven Spielberg</name>
        <age>55</age>
        <sex>male</sex>
    </director>
</directors>

必需的输出:

<directors>
    <director>
        <name>Steven Spielberg</name>
        <age>55</age>
        <sex>male</sex>
        <movies>
            <movie>
                <name>ET</name>
                <date>15 January 2000</date>
            </movie>
            <movie>
                <name>The Neverending Story</name>
                <date>4 November 2006</date>
            <movie>
        </movies>
    </director>
</directors>

XSL:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method = "xml" indent = "yes" /> 

    <xsl:variable name="movieFile" select="document('movies.xml')" />

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="$movieFile/movies/movie/director">
        <xsl:copy>
            <xsl:apply-templates />
      </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

目前,它正在每个电影组中打印整个导演列表。

有人可以给我一些指导吗?

2 个答案:

答案 0 :(得分:2)

如果您将第二个模板替换为此模板,并提供&#39; directors.xml&#39;文件作为输入它应该工作:

<xsl:template match="director">
    <xsl:variable name="director-name" select="name"/>
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    <xsl:apply-templates select="document('movies.xml')/movies/movie[director=$director-name]" />
    </xsl:copy>
</xsl:template>

使用身份模板复制每个节点,但上面的director节点除外,您可以在其中添加movie文件的匹配内容。

答案 1 :(得分:1)

如果你确实可以使用XSLT 2.0,那么这可能非常简单:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:variable name="movieFile" select="document('movies.xml')" />

<xsl:key name="movie-by-director" match="movie" use="director" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="director">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <movies>
            <xsl:apply-templates select="key('movie-by-director', name, $movieFile)" />
        </movies>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>