如何在XSLT中通过循环与变量批量生成升序编号新节点
XSLT 2.0 批量生成顺序item节点实现方案
你现有写好的filter节点映射逻辑不需要做任何修改,只要在Envelope根节点的输出模板内,追加一段循环生成逻辑即可,全程不需要手写重复的item标签。
核心实现逻辑
XSLT 2.0 原生支持整数区间序列语法start to end,可以直接生成从起始值到结束值的升序整数序列,配合xsl:for-each遍历就能自动按顺序生成对应数量的节点,不需要手写递归或者逐行硬编码。
如果需要灵活调整生成的item数量,可以先定义变量存储总数量,后续修改只需要改变量值即可,维护成本更低。
完整代码示例
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配源文件根节点Envelope --> <xsl:template match="/Envelope"> <Envelope> <!-- 保留你原有filter节点的全部映射逻辑,不需要改动 --> <xsl:apply-templates select="filter"/> <!-- 批量生成item节点逻辑 --> <!-- 定义要生成的item总数量,后续要改数量直接修改这个变量值就行 --> <xsl:variable name="totalItem" select="10"/> <!-- 遍历1到totalItem的整数序列,自动升序 --> <xsl:for-each select="1 to $totalItem"> <item> <!-- 当前遍历的整数值作为item的节点值 --> <xsl:value-of select="."/> </item> </xsl:for-each> </Envelope> </xsl:template> <!-- 你原有的filter节点映射模板,保持原有代码不变即可 --> <xsl:template match="filter"> <!-- 示例是直接复制原节点,如果你有自定义映射逻辑,保留自己的代码就行 --> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet>
效果说明
- 转换后输出的XML会先完整保留你原有映射的filter节点内容,之后按1到10的升序追加10个item节点,和预期结构完全一致。
- 如果你不需要灵活调整item数量,可以删掉变量定义,直接把循环的select属性写成
1 to 10,效果完全相同。 - 循环内的上下文项
.就是当前遍历到的整数值,如果需要给item加属性、或者拼接其他内容,直接在<item>标签内补充逻辑即可。
注意:
to关键字是XSLT 2.0及以上版本才支持的序列语法,你当前用的是XSLT2.0环境可以直接运行,不需要额外兼容处理。
转换后的输出结构参考:
<?xml version="1.0" encoding="UTF-8"?> <Envelope> <filter> <type>book</type> <pageLimit>200</pageLimit> <brand>1</brand> </filter> <item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item> <item>6</item> <item>7</item> <item>8</item> <item>9</item> <item>10</item> </Envelope>
内容的提问来源于stack exchange,提问作者Bc. MD. Peter Trahnyuk
相关产品推荐
相关产品推荐

