如何使用XSLT为XML同名元素添加序号并重命名
为同名XML元素添加序号重命名的XSLT解决方案
我有多个同名的XML元素(例如<risks>),需要使用XSLT为这些元素添加序号,重命名为risks_1、risks_2这类带序号的形式。以下是输入XML、期望输出XML,以及我尝试但未成功的XSLT代码,恳请协助解决。
输入XML
<?xml version="1.0" encoding="UTF-8"?> <response> <score>0.8</score> <risks>5001</risks> <risks>1006</risks> <risks>1045</risks> ...... <risks>1456</risks> <version>SCO</version> </response>
期望输出XML
<?xml version="1.0" encoding="UTF-8"?> <response> <score>0.8</score> <risks_1>5001</risks_1> <risks_2>1006</risks_2> <risks_3>1045</risks_3> ..... <risks_n>1456</risks_n> <version>SCO</version> </response>
我尝试的XSLT代码(未成功)
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:template match="/response"> <xsl:element name="SCO"> <xsl:apply-templates/> </xsl:element> </xsl:template> <xsl:template match="@* | node()"> <xsl:choose> <xsl:when test="local-name() = 'risks'"> <xsl:element name="{concat({local-name()},format-number(count(preceding::risks)+1,'0')}"></xsl:element> </xsl:when> </xsl:choose> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
修正后的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <!-- 身份模板:复制所有未被特殊匹配的节点和属性 --> <xsl:template match="@* | node()"> <xsl:copy> <xsl:apply-templates select="@* | node()"/> </xsl:copy> </xsl:template> <!-- 专门匹配risks元素,重命名为带序号的形式 --> <xsl:template match="risks"> <xsl:element name="{concat(local-name(), '_', position())}"> <xsl:apply-templates select="@* | node()"/> </xsl:element> </xsl:template> </xsl:stylesheet>
代码说明
- 身份模板:保留默认的节点复制逻辑,确保除
risks外的所有元素、属性和文本都原样输出。 - risks元素处理:
- 使用
position()直接获取当前risks在同级节点中的位置序号,比count(preceding::risks)+1更高效。 - 通过
concat(local-name(), '_', position())拼接出新的元素名,比如risks_1、risks_2。 - 复制原
risks元素的所有属性和内部内容到新元素中。
- 使用
- 根元素
<response>保持不变,无需额外修改模板。
内容的提问来源于stack exchange,提问作者serg
相关产品推荐
相关产品推荐

