如何用XSLT将根元素下所有内容转为新元素的子元素?
XSLT实现根元素下嵌套新元素的方案
核心思路
- 保留源XML根元素的名称与属性,仅修改其内部结构
- 在根元素内创建自定义名称的新元素,作为原根元素所有子内容的容器
- 通过模板匹配机制,确保原根元素下的所有节点(包括元素、文本、注释等)完整迁移到新元素中
实现代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 身份模板:默认复制所有节点和属性,保证非根元素内容原样保留 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 匹配根元素,重构其内部结构 --> <xsl:template match="//*"> <xsl:copy> <!-- 复制根元素的所有属性 --> <xsl:apply-templates select="@*"/> <!-- 自定义新元素名称,可根据需求修改为任意名称 --> <wrapper> <!-- 将原根元素下的所有子节点迁移到新元素内 --> <xsl:apply-templates select="node()"/> </wrapper> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:作为基础模板,负责复制所有未被特殊匹配的节点和属性,确保XML中除根元素内部结构外的内容完全保留。
- 根元素匹配模板:
<xsl:copy>:保留原根元素的标签名称<xsl:apply-templates select="@*"/>:复制根元素的所有属性(如果存在)- 自定义
<wrapper>元素:你可以将这个名称替换为任何需要的元素名(比如<content>) <xsl:apply-templates select="node()"/>:将原根元素下的所有子节点(包括文本、注释、处理指令等)全部复制到新元素内部
示例效果
源XML:
<root data-id="123"> <item>示例内容</item> <!-- 测试注释 --> 这是文本节点 </root>
转换后XML:
<root data-id="123"> <wrapper> <item>示例内容</item> <!-- 测试注释 --> 这是文本节点 </wrapper> </root>
内容的提问来源于stack exchange,提问作者Stephen Bentley
相关产品推荐
相关产品推荐

