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

XSLT3.0如何使用xsl:for-each-group分组fn:unparsed-text-lines返回的字符串序列

问题原因

你写的分组逻辑不生效的核心原因是:group-starting-with="text()[not(starts-with(.,' '))]" 是节点测试语法,仅适用于分组序列为节点的场景。而 fn:unparsed-text-lines() 返回的是 xs:string 类型的原子值序列,不是DOM节点,自然无法匹配text()节点测试,所以分组逻辑失效,也完全不需要额外把字符串转换为节点。


正确实现方案

直接修改group-starting-with的匹配规则,用.指代当前遍历的字符串项即可,代码如下:

<xsl:for-each-group select="unparsed-text-lines('filename.txt','utf-8')" 
                    group-starting-with=".[not(starts-with(., ' '))]">
  <line>
    <!-- 先去掉每个行的前导空格,再用空格拼接整组内容 -->
    <xsl:value-of select="current-group() ! replace(., '^\s+', '')" separator=" "/>
  </line>
</xsl:for-each-group>

逻辑说明

  1. group-starting-with=".[not(starts-with(., ' '))]":每遍历到一个不以空格开头的字符串项,就开启一个新的分组
  2. current-group() ! replace(., '^\s+', ''):遍历当前分组的所有行,去掉每一行开头的所有空白字符
  3. 用空格作为分隔符拼接处理后的行内容,包裹在line元素中输出,结果完全符合你的预期。

这种方案直接处理字符串序列,不需要额外的节点转换开销,是最优实现。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:06:03