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

如何用XSLT的for-each-group与group-starting-with实现ques及后续p节点分组?

问题需求

将<ques>元素及其紧随的所有同级<p>元素包裹到<group>元素中。

输入XML

<root>
<title>Title</title>
<p>para</p>
<ques>Ques</ques>
<p>aaaa</p>
<fig>aaa</fig>
<box>box</box>
<ques>Ques</ques>
<p>aaaa</p>
<p>bbbb</p>
</root>

当前XSLT问题

你当前的代码用group-starting-with="ques"会把每个<ques>到下一个<ques>之间的所有元素(包括<fig>、<box>这类非<p>元素)都归入同一组,无法满足只包裹<ques>和紧随的同级<p>的需求。

修正后的XSLT代码

<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>

<xsl:template match="root">
    <xsl:copy>
        <!-- 按节点是否为ques或紧随ques/p的p进行相邻分组 -->
        <xsl:for-each-group select="*" group-adjacent="boolean(self::ques or (self::p and preceding-sibling::*[1][self::ques or self::p]))">
            <xsl:choose>
                <!-- 属于ques+p连续组的元素,包裹到<group>中 -->
                <xsl:when test="current-grouping-key()">
                    <group>
                        <xsl:copy-of select="current-group()"/>
                    </group>
                </xsl:when>
                <!-- 其他元素原样输出 -->
                <xsl:otherwise>
                    <xsl:copy-of select="current-group()"/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

期望输出

<root>
  <title>Title</title>
  <p>para</p>
  <group>
    <ques>Ques</ques>
    <p>aaaa</p>
  </group>
  <fig>aaa</fig>
  <box>box</box>
  <group>
    <ques>Ques</ques>
    <p>aaaa</p>
    <p>bbbb</p>
  </group>
</root>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:13:22