如何使用XSLT 1.0修改XML的嵌套结构?
XSLT 1.0 解决方案
针对你需要将平级元素转为嵌套结构的需求,可以通过以下XSLT代码实现:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 默认模板:复制所有未被匹配的节点(保留table等外层结构) --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 专门处理CLASS元素,修改其子元素结构 --> <xsl:template match="CLASS"> <xsl:copy> <!-- 第一步:按顺序输出所有子元素的开始标签 --> <xsl:for-each select="*"> <xsl:element name="{name()}"> </xsl:for-each> <!-- 第二步:闭合最后一个子元素(Weight)的标签 --> <xsl:element name="{name(*[last()])}"/> <!-- 第三步:倒序输出前面所有子元素的闭合标签 --> <xsl:for-each select="*[position() < last()]"> <xsl:sort select="position()" data-type="number" order="descending"/> <xsl:element name="{name()}"/> </xsl:for-each> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 默认模板:确保外层的
table元素以及其他未指定处理规则的节点被原样复制,避免结构丢失。 - CLASS元素处理模板:
- 先遍历
CLASS下的所有子元素,依次输出它们的开始标签(<Name>、<Sex>、<Age>、<Height>、<Weight>)。 - 单独闭合最后一个子元素(
Weight)的标签。 - 对前面的子元素按位置倒序排序,依次输出它们的闭合标签(
</Height>、</Age>、</Sex>、</Name>),从而形成嵌套结构。
- 先遍历
这个方案完全基于XSLT 1.0语法,不需要额外扩展,适配你的需求场景。
内容的提问来源于stack exchange,提问作者ks1001
相关产品推荐
相关产品推荐

