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

如何使用XSLT移除XML中重复ID且IS_ACTIVE为0的记录?

问题:移除重复ID且IS_ACTIVE=0的XML记录并转换为TXT

需要将给定的XML转换为TXT格式,规则是:移除重复ID且IS_ACTIVE状态为0的记录,其余记录保留。

源XML:

<Report_Data>
    <Report_Entry>
        <ID>12345</ID>
        <Date>2001-12-31</Date>
        <IS_ACTIVE>1</IS_ACTIVE>
    </Report_Entry>
    <Report_Entry>
        <ID>12345</ID>
        <Date>2002-12-31</Date>
        <IS_ACTIVE>0</IS_ACTIVE>
    </Report_Entry>
    <Report_Entry>
        <ID>98765</ID>
        <Date>2003-12-31</Date>
        <IS_ACTIVE>1</IS_ACTIVE>
    </Report_Entry>
    <Report_Entry>
        <ID>88888</ID>
        <Date>2004-12-31</Date>
        <IS_ACTIVE>0</IS_ACTIVE>
    </Report_Entry>
</Report_Data>

期望生成的TXT内容:

ID|Date|IS_ACTIVE
12345|2001-12-31|1
98765|2003-12-31|1
88888|2004-12-31|0
解决方案:XSLT实现

使用XSLT 2.0及以上版本的for-each-group按ID分组处理即可实现需求,核心逻辑是:对每个ID组,若组内存在IS_ACTIVE=1的记录,则仅保留该记录;若组内全是IS_ACTIVE=0的记录,则保留该记录。

完整XSLT代码:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8" />
    <xsl:strip-space elements="*" />

    <!-- 输出表头 -->
    <xsl:template match="/">
        <xsl:text>ID|Date|IS_ACTIVE&#10;</xsl:text>
        <xsl:apply-templates select="Report_Data/Report_Entry" />
    </xsl:template>

    <!-- 按ID分组处理每个记录组 -->
    <xsl:template match="Report_Entry">
        <xsl:for-each-group select="." group-by="ID">
            <!-- 判断组内是否有IS_ACTIVE=1的记录 -->
            <xsl:variable name="has-active" select="current-group()[IS_ACTIVE='1']" />
            <xsl:choose>
                <!-- 存在活跃记录,输出活跃记录 -->
                <xsl:when test="$has-active">
                    <xsl:value-of select="$has-active/ID" />
                    <xsl:text>|</xsl:text>
                    <xsl:value-of select="$has-active/Date" />
                    <xsl:text>|</xsl:text>
                    <xsl:value-of select="$has-active/IS_ACTIVE" />
                    <xsl:text>&#10;</xsl:text>
                </xsl:when>
                <!-- 无活跃记录,输出当前组的记录(即IS_ACTIVE=0的唯一记录) -->
                <xsl:otherwise>
                    <xsl:value-of select="ID" />
                    <xsl:text>|</xsl:text>
                    <xsl:value-of select="Date" />
                    <xsl:text>|</xsl:text>
                    <xsl:value-of select="IS_ACTIVE" />
                    <xsl:text>&#10;</xsl:text>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>
逻辑说明
  • 通过for-each-group select="." group-by="ID"将所有Report_Entry按ID分组,确保每个ID只处理一次。
  • 定义变量$has-active筛选组内IS_ACTIVE=1的记录,若存在则输出该记录;若不存在(说明该ID只有IS_ACTIVE=0的记录),则输出该记录。
  • 利用xsl:text添加分隔符|和换行符&#10;,生成符合要求的TXT结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:38:10