使用XSLT将子节点合并到其他XML

时间:2016-02-04 22:57:22

标签: xml xslt xsd

假设我有一个XML文档:

<Somethings>
  <everythings>
     <name>Mr.Johansson</name>
  </everythings>
  <nothings />
</Somethings>

我有另一个XML文档

<empty>
     <name>Mr.Doit</name>
     <age>94</age>
     <living>true</living>
</empty>

我想将所有子节点从第二个xml复制到第一个xml的<nothings />标记。所以我得到了

<Somethings>
  <everythings>
     <name>Mr.Johansson</name>
  </everythings>
  <nothings>
     <nothing>
         <name>Mr.Doit</name>
         <age>94</age>
         <living>true</living>
     </nothing>
  </nothings>
</Somethings>

我确实可以使用以下命令复制所有子节点:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xs"
                version="2.0">
    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

    <xsl:template match="*">
        <xsl:element name="{local-name()}">
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="/*">
        <nothing>
            <xsl:apply-templates/>
        </nothing>
    </xsl:template>

</xsl:stylesheet>

编辑:问题是将子节点合并到一个元素中。不是将两个兄弟节点合并到一个元素中。第二个问题是关于获取所有值然后合并到元素中。

1 个答案:

答案 0 :(得分:2)

以这种方式尝试:

<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:strip-space elements="*"/>

<xsl:param name="path-to-external" select="'external.xml'"/>

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

<xsl:template match="nothings">
    <xsl:copy>
        <xsl:apply-templates select="document($path-to-external)"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="empty">
    <nothing>
        <xsl:apply-templates/>
    </nothing>
</xsl:template>

</xsl:stylesheet>

external.xml替换为“其他”文档的路径。