使用 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" 文档的路径。
假设我有一个 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" 文档的路径。