如何在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
相关产品推荐
相关产品推荐

