咨询:利用属性值创建新标签的XSLT转换实现方法
解决方案:用XSLT动态生成元素名处理可变列结构
完全可行,核心是利用XSLT的<xsl:element>指令动态创建元素,结合属性值拼接新标签名即可实现需求。以下是具体实现代码及说明:
输入XML示例
<root> <row> <column inum="1">第一列内容</column> <column inum="2">第二列内容</column> </row> <row> <column inum="1">另一行第一列</column> <column inum="3">另一行第三列</column> </row> </root>
XSLT转换代码
<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> <!-- 匹配row下的column元素,动态生成新命名的元素 --> <xsl:template match="row/column"> <!-- 拼接新元素名:column_ + inum属性值 --> <xsl:element name="column_{@inum}"> <!-- 保留原column的所有内容(文本、子节点)及除inum外的其他属性 --> <xsl:apply-templates select="@*[not(local-name()='inum')]|node()"/> </xsl:element> </xsl:template> <!-- 移除原column的inum属性(已用于元素名,无需保留) --> <xsl:template match="column/@inum"/> </xsl:stylesheet>
关键逻辑说明
- 身份模板确保
<root>、<row>等原有结构完全保留,只修改目标<column>元素。 <xsl:element name="column_{@inum}">通过大括号语法{@inum}提取属性值,动态拼接生成新元素名。- 最后一个模板专门过滤掉原
<column>的inum属性,避免新元素携带冗余属性。
输出XML示例
<root> <row> <column_1>第一列内容</column_1> <column_2>第二列内容</column_2> </row> <row> <column_1>另一行第一列</column_1> <column_3>另一行第三列</column_3> </row> </root>
该方案支持任意行数、列数的输入,只要<column>节点带有inum属性即可自动完成转换。
内容的提问来源于stack exchange,提问作者Lore
相关产品推荐
相关产品推荐

