我无法找到合适的示例将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>
目前,它正在每个电影组中打印整个导演列表。
有人可以给我一些指导吗?
答案 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>