You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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>

关键改动说明

  1. 统一计数范围:给所有<xsl:number>添加count="note|bignote|gibnote"属性,指定计数包含这三种标签(匹配期望输出中<gibnote>的转换需求),这样就能生成连续的统一编号。
  2. 标签转换:将<bignote>和<gibnote>都转换为<note>标签,对齐期望输出的结构。
  3. rank属性生成:通过<xsl:attribute>创建rank属性,值为note拼接当前统一编号。
  4. 内容前缀处理:给<bignote>和<gibnote>的内容添加BIG前缀,匹配期望输出的格式。

修改后,所有目标标签会按出现顺序生成连续编号,完全符合预期输出。


内容的提问来源于stack exchange,提问作者fauve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:24:58