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

如何使用XSLT为XML文档中特定区间内容块包裹group标签

问题原因

你现有代码丢失区间外内容的核心原因是:仅对以p[@type='start']开头的分组做了输出处理,其余普通分组全部被<xsl:if>逻辑过滤,同时缺少默认的节点复制规则,无法保留其余内容结构。

解决方案

以下是兼容XSLT 2.0及以上版本的实现代码,可完全满足你的需求:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 身份转换模板:默认原样复制所有未被显式匹配的节点和属性 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="doc">
        <xsl:copy>
            <xsl:for-each-group select="*" group-starting-with="p[@type = 'start']">
                <xsl:choose>
                    <!-- 处理start标记开头的分组,包裹group标签 -->
                    <xsl:when test="self::p[@type = 'start']">
                        <group>
                            <!-- 输出start和end标记之间的所有内容,自动过滤标记节点 -->
                            <xsl:apply-templates select="current-group()[position() gt 1][not(self::p[@type = 'end'])]" />
                        </group>
                    </xsl:when>
                    <!-- 非start开头的普通分组直接输出所有内容 -->
                    <xsl:otherwise>
                        <xsl:apply-templates select="current-group()" />
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

关键修改说明

  1. 新增身份转换模板作为兜底规则,所有未自定义处理逻辑的节点都会被原样复制,确保文档其余结构不受影响
  2. 用<xsl:choose>分支替代原有的单一<xsl:if>判断,普通区间的节点可以正常输出不会丢失
  3. 简化了内层逻辑,无需二次分组即可直接截取start和end标记之间的有效内容,同时自动过滤掉start、end标记本身
  4. 所有内容输出都通过<xsl:apply-templates>处理,你后续如果有其他节点的自定义处理逻辑,直接新增对应匹配模板即可正常生效。

内容的提问来源于stack exchange,提问作者Cutú Chiqueño

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 07:24:03