XSL实现为嵌套元素添加带自增计数的@fn属性
解决XSLT嵌套元素无法添加自增@fn属性的问题
问题根源
你的XSLT只匹配了顶层的<seg>元素,嵌套的<date>、<note>没有被对应模板捕获——默认的节点复制模板只会原样复制节点,不会为这些嵌套目标元素添加@fn属性。同时原计数逻辑可能仅针对当前上下文的节点,没有全局遍历所有目标元素进行编号。
修正后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配所有需要添加fn属性的目标元素:seg、date、note --> <xsl:template match="seg|date|note"> <xsl:copy> <!-- 按文档顺序为所有目标元素生成自增编号 --> <xsl:attribute name="fn"> <xsl:number count="seg|date|note" level="any"/> </xsl:attribute> <!-- 递归处理子节点,确保嵌套元素也能被匹配处理 --> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 默认复制模板:处理所有未匹配的节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码关键说明
全局计数逻辑:
使用<xsl:number count="seg|date|note" level="any"/>,count指定要计数的元素集合,level="any"会遍历整个文档树,按元素出现的先后顺序统一编号,不管嵌套层级。统一匹配模板:
为所有目标元素(seg/date/note)写一个匹配模板,确保无论元素处于顶层还是嵌套结构,都会被捕获并添加@fn属性。递归处理子节点:
在模板中调用<xsl:apply-templates select="@*|node()"/>,保证子节点(包括嵌套的目标元素)能被后续模板处理,而不是直接跳过。
示例验证
原XML(示例)
<root> <seg>第一段文本<date>2024-05-20</date></seg> <note>这是一个注释</note> </root>
转换后期望结果
<root> <seg fn="1">第一段文本<date fn="2">2024-05-20</date></seg> <note fn="3">这是一个注释</note> </root>
内容的提问来源于stack exchange,提问作者jbrehr
相关产品推荐
相关产品推荐

