如何使用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 </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> </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> </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添加分隔符|和换行符 ,生成符合要求的TXT结构。
内容的提问来源于stack exchange,提问作者Wanru He
相关产品推荐
相关产品推荐

