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

如何使用XSLT筛选每个不同属性值元素的首次出现(无需硬编码)

解决方案

你可以通过通用匹配规则实现自动去重,无需枚举所有md属性值,以下是两种常用实现方案:

方案1:preceding-sibling匹配(代码最简洁,适合中小体量XML)

直接增加一条通用空模板,忽略所有非首次出现的同md值codes.head元素即可,完整XSLT代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 身份模板:原样复制所有不需要修改的节点和属性 -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 通用去重规则:忽略非首次出现的、md属性符合hg*/hg*c格式的codes.head元素 -->
    <xsl:template match="codes.head[matches(@md, '^hg\d+c?$') and @md = preceding-sibling::codes.head/@md]" />
</xsl:stylesheet>

规则说明:

  • preceding-sibling::codes.head/@md会获取当前节点之前所有同级codes.head的md属性值,只要当前节点的md值在其中存在,就判定为重复,不输出
  • matches(@md, '^hg\d+c?$')是正则校验,仅处理符合格式要求的md属性,避免误操作其他codes.head元素,如果不需要格式限制可以直接删除该条件

方案2:分组去重(性能更优,适合大体积XML)

通过xsl:for-each-group按md属性分组,每组仅输出第一个元素,性能高于逐个遍历前面节点的方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="head.block">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <!-- 按md属性分组,每组取第一个元素输出 -->
            <xsl:for-each-group select="codes.head[matches(@md, '^hg\d+c?$')]" group-by="@md">
                <xsl:apply-templates select="."/>
            </xsl:for-each-group>
            <!-- 保留head.block内除codes.head外的其他节点 -->
            <xsl:apply-templates select="* except codes.head"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

两种方案都可以得到你需要的输出结果,不需要硬编码任何md属性值。

内容的提问来源于stack exchange,提问作者Sai Prasad Mukthapuram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:51:01