如何为XML属性转标签的XSLT模板添加重复标签唯一编号功能?
解决方案
要将重复标签转换为带编号的唯一标签,需要在原有XSLT模板基础上新增匹配元素节点的模板,通过计算当前元素在同级同名元素中的位置,将序号拼接在原标签名后生成唯一标识。
修改后的完整XSLT代码
<script type="text/xsl" id="myXsltTemplate"> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> <xsl:output method="xml" indent="yes"/> <!-- 匹配所有节点,作为默认模板(被更具体的模板覆盖) --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 将属性转换为标签(保留原有功能) --> <xsl:template match="@*"> <xsl:element name="{name()}"><xsl:value-of select="."/></xsl:element> </xsl:template> <!-- 处理重复元素,生成带编号的唯一标签 --> <xsl:template match="*"> <!-- 计算当前元素在同级同名元素中的序号 --> <xsl:variable name="elementIndex" select="count(preceding-sibling::*[name()=name(current())]) + 1"/> <!-- 生成带编号的新元素名 --> <xsl:element name="{name()}{$elementIndex}"> <!-- 继续处理当前元素的属性和子节点 --> <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:template> </xsl:stylesheet> </script>
关键逻辑说明
- 新增的
<xsl:template match="*">模板优先级高于默认的match="@* | node()",会专门处理所有元素节点 count(preceding-sibling::*[name()=name(current())]) + 1:统计当前元素之前的同级同名元素数量,加1得到当前元素的序号(第一个同名元素序号为1,第二个为2,以此类推)<xsl:element name="{name()}{$elementIndex}">:将原标签名与序号拼接,生成如image1、image2这类唯一标签- 内部的
<xsl:apply-templates select="@* | node()"/>会继续触发属性转标签的模板,保留原有功能
示例效果
输入XML片段:
<root> <image src="pic1.jpg"/> <image src="pic2.jpg"/> </root>
转换后输出:
<root1> <image1> <src>pic1.jpg</src> </image1> <image2> <src>pic2.jpg</src> </image2> </root1>
内容的提问来源于stack exchange,提问作者Sylwester Zabielski
相关产品推荐
相关产品推荐

