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

如何在XSLT 2.0中基于元素值获取唯一节点?

基于Container值筛选唯一DR-Item节点并生成指定输出

XSLT 1.0 实现(兼容性更强)

使用Muenchian分组是XSLT 1.0中处理节点去重的标准方法,以下是完整的转换代码:

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

    <!-- 按Container文本值对DR-Item节点分组 -->
    <xsl:key name="container-group" match="DR-Item" use="Container"/>

    <xsl:template match="/">
        <!-- 筛选每个分组中的第一个节点(即唯一Container对应的节点) -->
        <xsl:for-each select="Body/DR/DR-Item[count(. | key('container-group', Container)[1]) = 1]">
            <GM>
                <!-- 复制需要的子节点 -->
                <xsl:copy-of select="Container"/>
                <xsl:copy-of select="r"/>
                <xsl:copy-of select="t"/>
            </GM>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

XSLT 2.0+ 实现(写法更简洁)

如果使用支持XSLT 2.0及以上版本的处理器,可以直接使用分组语法简化代码:

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

    <xsl:template match="/">
        <!-- 按Container值分组DR-Item节点 -->
        <xsl:for-each-group select="Body/DR/DR-Item" group-by="Container">
            <GM>
                <!-- 取当前组第一个节点的指定子节点 -->
                <xsl:copy-of select="current-group()[1]/(Container, r, t)"/>
            </GM>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

核心逻辑说明

两种方法的核心都是对DR-Item节点按Container的值进行分组,然后只处理每个分组中的第一个节点,最终生成包含Container、r、t的<GM>元素,完全匹配你需要的输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 07:07:03