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

XSLT如何按id合并两个group节点内容到同一个KML Folder

解决方案

你的判断是正确的:XSLT为流式输出,一旦Entryway对应的Folder节点输出完成,就无法再追加内容,因此需要调整处理逻辑,有两种常用实现方式:

方案1:调整上层节点选择逻辑(推荐)

将两个需要合并的特殊group和普通group分开处理,修改你原来的apply-templates代码:

<!-- 先处理所有不需要合并的普通group -->
<xsl:apply-templates select="ds:group[not(ds:id='Route' or ds:id='Entryway')]">
    <xsl:sort select="ds:display_name"/>
</xsl:apply-templates>
<!-- 单独生成合并后的Accessible Folder -->
<Folder id="Accessible">
    <name>Accessible Features</name>
    <!-- 加载Entryway组下的所有item -->
    <xsl:apply-templates select="ds:group[ds:id='Entryway']/ds:item">
        <xsl:sort select="ds:name"/>
    </xsl:apply-templates>
    <!-- 加载Route组下的所有item -->
    <xsl:apply-templates select="ds:group[ds:id='Route']/ds:item">
        <xsl:sort select="ds:name"/>
    </xsl:apply-templates>
</Folder>

对应的ds:group模板可以简化,只保留普通group的处理逻辑即可:

<xsl:template match="ds:group">
    <Folder id="{ds:id}">
        <name>
            <xsl:value-of select="ds:display_name"/>
        </name>
        <xsl:apply-templates select="ds:item">
            <xsl:sort select="ds:name"/>
        </xsl:apply-templates>
    </Folder>
</xsl:template>

方案2:保留原有调用逻辑,修改group模板

如果不想调整上层的apply-templates选择规则,可以直接修改你现有的group模板,处理Entryway组时主动加载Route组的item,Route组直接跳过输出:

<xsl:template match="ds:group">
    <xsl:choose>
        <xsl:when test="not(ds:id = 'Route') and not(ds:id = 'Entryway')">
            <Folder id="{ds:id}">
                <name>
                    <xsl:value-of select="ds:display_name"/>
                </name>
                <xsl:apply-templates select="ds:item">
                    <xsl:sort select="ds:name"/>
                </xsl:apply-templates>
            </Folder>
        </xsl:when>
        <xsl:when test="ds:id = 'Entryway'">
            <Folder id='Accessible'>
                <name>
                    <xsl:value-of select="ds:display_name"/>
                </name>
                <!-- 处理当前Entryway的item -->
                <xsl:apply-templates select="ds:item">
                    <xsl:sort select="ds:name"/>
                </xsl:apply-templates>
                <!-- 额外加载Route组的所有item -->
                <xsl:apply-templates select="../ds:group[ds:id='Route']/ds:item">
                    <xsl:sort select="ds:name"/>
                </xsl:apply-templates>
            </Folder>
        </xsl:when>
        <!-- Route组直接跳过,不生成任何输出 -->
        <xsl:when test="ds:id = 'Route'"/>
        <xsl:otherwise/>
    </xsl:choose>
</xsl:template>

补充说明

你之前尝试的匹配语法ds:id='Route' | ds:id='Entryway'语法错误,正确的节点匹配写法是ds:group[ds:id='Route' or ds:id='Entryway'],但这种写法会让两个group分别触发模板两次,依然会生成两个Folder,无法满足合并需求。

注意确认你的XSLT根节点已经声明了命名空间xmlns:ds="http://ws.wso2.org/dataservice",否则节点选择逻辑会失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:05