如何使用xslt转换嵌套的XML元素,保留结构?
假设我有一个这样的XML文档:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<node>
</node>
<node>
<node>
<node>
</node>
</node>
</node>
</root>
我想得到这样的东西:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element>
</element>
<element>
<element>
<element>
</element>
</element>
</element>
</root>
我应该使用什么样的xslt?
谢谢!
答案 0 :(得分:5)
在XSLT中执行此操作的方法是这样的(使用identity rule和推送样式):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="node">
<element>
<xsl:apply-templates select="node()|@*"/>
</element>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<root>
<node>
</node>
<node>
<node>
<node>
</node>
</node>
</node>
</root>
产生了想要的正确结果:
<root>
<element/>
<element>
<element>
<element/>
</element>
</element>
</root>
请注意:
使用身份规则及其仅覆盖特定元素 - 这是最基本和最强大的XSLT设计模式。
如何通过使用1.我们实现优雅而纯粹的“推动式”转型。
答案 1 :(得分:3)
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root">
<root>
<xsl:apply-templates />
</root>
</xsl:template>
<xsl:template match="node">
<element>
<xsl:apply-templates />
</element>
</xsl:template>
</xsl:stylesheet>
密钥是apply-templates
标记,用于递归处理标记内容。