XSLT通用方案:按TYPE属性值重命名XML元素标签
通用XSLT转换实现方案
不需要为每个TYPE取值单独编写匹配模板,XSLT支持动态创建元素,仅需一个通用匹配规则即可覆盖所有转换场景,完整可直接运行的代码如下:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" omit-xml-declaration="yes" /> <!-- 身份复制模板:原样复制所有不需要特殊处理的节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()" /> </xsl:copy> </xsl:template> <!-- 通用模板:匹配所有带TYPE属性的元素,无需枚举任何TYPE取值 --> <xsl:template match="*[@TYPE]"> <!-- 动态生成新标签,标签名直接取TYPE属性的取值 --> <xsl:element name="{@TYPE}"> <!-- 先复制原元素除TYPE、DESC外的所有原有属性 --> <xsl:apply-templates select="@*[name()!='TYPE' and name()!='DESC']" /> <!-- 按规则设置DESC属性,值为原始标签名 --> <xsl:attribute name="DESC"> <xsl:value-of select="name()"/> </xsl:attribute> <!-- 递归处理所有子节点 --> <xsl:apply-templates select="node()" /> </xsl:element> </xsl:template> </xsl:stylesheet>
逻辑说明
- 该实现完全兼容XSLT 1.0标准,所有主流XSLT解析器都可以直接运行
- 自动匹配所有携带
TYPE属性的元素,无论TYPE属性的取值是什么,都能按照规则完成标签重命名和DESC属性设置,不需要提前枚举可能的TYPE值 - 元素原有除TYPE外的属性、子节点结构都会完整保留,转换结果和给出的预期输出完全一致
- 不带TYPE属性的节点(比如示例中存放在NODE下的ENTITY/REQUEST条目、FLAG标签)会走默认的身份复制逻辑,不会被改动
内容的提问来源于stack exchange,提问作者Somebody
相关产品推荐
相关产品推荐

