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

如何在XSLT的for-each-group循环中将分组内容追加到全局数组

解决方案:用XSLT全局序列存储按<eop/>拆分的内容

要实现将XML内容按<eop/>拆分并存储到全局数组(XSLT中称为序列),可以通过顶层全局变量结合for-each-group完成——XSLT是声明式语言,无需命令式的“追加”操作,直接通过分组生成序列即可。

完整XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <!-- 全局序列:存储所有拆分后的片段,每个片段为<segment>元素 -->
    <xsl:variable name="split-segments" as="element(segment)*">
        <!-- 按<eop/>分组,仅选择有效节点(过滤空白文本) -->
        <xsl:for-each-group 
            select="/mainBody/descendant::node()[normalize-space() or self::*]" 
            group-ending-with="eop">
            <!-- 为每个分组生成新的<segment>元素 -->
            <segment>
                <!-- 复制当前分组的所有节点(若不需要保留<eop/>,改为current-group()[not(self::eop)]) -->
                <xsl:copy-of select="current-group()"/>
            </segment>
        </xsl:for-each-group>
    </xsl:variable>

    <!-- 主模板:可在此使用全局序列做后续处理 -->
    <xsl:template match="mainBody">
        <processed-content>
            <!-- 示例:输出所有拆分后的片段 -->
            <xsl:copy-of select="$split-segments"/>
        </processed-content>
    </xsl:template>

</xsl:stylesheet>

关键说明

  • 全局序列定义:顶层<xsl:variable>声明全局变量$split-segments,as="element(segment)*"指定其类型为多个<segment>元素的序列。
  • 分组逻辑:group-ending-with="eop"将从上次分组结束(或文档开头)到<eop/>的所有节点划为一组;select路径过滤了无意义的空白文本节点,避免生成空片段。
  • 片段包装:每个分组被包裹在<segment>元素中,方便后续统一处理;若不需要保留<eop/>标签,将current-group()改为current-group()[not(self::eop)]即可。
  • 后续使用:在任意模板中直接引用$split-segments即可访问所有拆分后的片段,比如遍历输出、进一步转换等。

输出示例(简化版)

处理提供的XML后,全局序列$split-segments将包含以下片段:

<segment>
    <p>befre eop</p>
    <eop eId="eop_386"/>
</segment>
<segment>
    <p>after oep</p>
</segment>
<segment>
    <article_2>
        <content>
            <p>point content</p>
        </content>
    </article_2>
</segment>
<!-- 其余片段省略 -->

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:35:30