如何让XSLT中note与bignote标签共用同一编号序列?
问题:让和标签共享同一连续编号序列
我有一个包含<note>和<bignote>标签的XML文档,希望转换后让这两种标签的所有实例使用同一连续编号序列。
输入XML(input.xml)
<body> <p> dumy text dumy text dumy text dumy text <div> dumy text dumy text dumy text dumy text <note>LOREM</note> dumy text dumy text dumy text dumy text </div> <gibnote>IPSUM</gibnote> </p> <p> dumy text dumy text dumy text dumy text <note>DOLOR</note> dumy text dumy text dumy text dumy text </p> dumy text dumy text dumy text dumy text <bignote>SIT</bignote> <div> <note>AMET</note> </div> dumy text dumy text dumy text dumy text </body>
当前使用的XSLT(stylesheet.xslt)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <!-- identity transform --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <xsl:template match="note"> <xsl:copy> <xsl:number level="any" format="1. "/> <xsl:value-of select="."/> </xsl:copy> </xsl:template> <xsl:template match="bignote"> <xsl:copy> <xsl:number level="any" format="1. "/> <xsl:value-of select="."/> </xsl:copy> BIG </xsl:template> </xsl:stylesheet>
期望输出(output.xml)
<body> <p> dumy text dumy text dumy text dumy text <div> dumy text dumy text dumy text dumy text <note rank="note1">1. LOREM</note> dumy text dumy text dumy text dumy text </div> <note rank="note2">2. BIGIPSUM</note> </p> <p> dumy text dumy text dumy text dumy text <note rank="note3">3. DOLOR</note> dumy text dumy text dumy text dumy text </p> dumy text dumy text dumy text dumy text <note rank="note4">4. BIGSIT</note> <div> <note rank="note5">5. AMET</note> </div> dumy text dumy text dumy text dumy text </body>
当前问题
现在的转换结果中,<note>和<bignote>各自使用独立的编号序列,输出如下:
1. note Lorem 1. bignote Ipsum 2. note Dolor 2. bignote sit 3. note amet
如何修改XSLT让这两种标签遵循同一连续编号序列?
解决方案
要让<note>和<bignote>共享同一编号序列,核心是调整<xsl:number>的计数范围,同时匹配期望输出调整标签转换和属性逻辑:
修改后的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <!-- 基础复制模板 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 处理note标签 --> <xsl:template match="note"> <note> <!-- 生成rank属性,计数包含所有目标标签 --> <xsl:attribute name="rank"> <xsl:text>note</xsl:text> <xsl:number level="any" count="note|bignote|gibnote"/> </xsl:attribute> <!-- 统一编号 --> <xsl:number level="any" count="note|bignote|gibnote" format="1. "/> <xsl:value-of select="."/> </note> </xsl:template> <!-- 处理bignote标签,转换为note并添加BIG前缀 --> <xsl:template match="bignote"> <note> <xsl:attribute name="rank"> <xsl:text>note</xsl:text> <xsl:number level="any" count="note|bignote|gibnote"/> </xsl:attribute> <xsl:number level="any" count="note|bignote|gibnote" format="1. "/> <xsl:text>BIG</xsl:text> <xsl:value-of select="."/> </note> </xsl:template> <!-- 处理gibnote标签,转换为note并添加BIG前缀 --> <xsl:template match="gibnote"> <note> <xsl:attribute name="rank"> <xsl:text>note</xsl:text> <xsl:number level="any" count="note|bignote|gibnote"/> </xsl:attribute> <xsl:number level="any" count="note|bignote|gibnote" format="1. "/> <xsl:text>BIG</xsl:text> <xsl:value-of select="."/> </note> </xsl:template> </xsl:stylesheet>
关键改动说明
- 统一计数范围:给所有
<xsl:number>添加count="note|bignote|gibnote"属性,指定计数包含这三种标签(匹配期望输出中<gibnote>的转换需求),这样就能生成连续的统一编号。 - 标签转换:将
<bignote>和<gibnote>都转换为<note>标签,对齐期望输出的结构。 - rank属性生成:通过
<xsl:attribute>创建rank属性,值为note拼接当前统一编号。 - 内容前缀处理:给
<bignote>和<gibnote>的内容添加BIG前缀,匹配期望输出的格式。
修改后,所有目标标签会按出现顺序生成连续编号,完全符合预期输出。
内容的提问来源于stack exchange,提问作者fauve
相关产品推荐
相关产品推荐

