假设我有一个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>
编辑:问题是将子节点合并到一个元素中。不是将两个兄弟节点合并到一个元素中。第二个问题是关于获取所有值然后合并到元素中。
答案 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
替换为“其他”文档的路径。