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

Merge child nodes to other XML using XSLT

假设我有一个 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>

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

这样试试:

<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 替换为 "other" 文档的路径。