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

如何使用XSLT合并相同ID的XML节点并填充空值为N

XSLT实现同ID节点合并方案

核心实现思路

  • 按<row>的<ID>节点值对所有行节点分组
  • 每组内遍历所有列节点,优先取同组内该列的非空有效值,无有效值则统一填充N

XSLT 1.0 实现代码(兼容性最好,支持绝大多数运行环境)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 定义分组key:按ID值分组row节点 -->
    <xsl:key name="rowGroup" match="row" use="ID"/>
    
    <xsl:template match="/OBR">
        <OBR>
            <!-- Muenchian分组法取每个分组的第一个row作为分组标识 -->
            <xsl:for-each select="row[count(. | key('rowGroup', ID)[1]) = 1]">
                <xsl:variable name="currentGroup" select="key('rowGroup', ID)"/>
                <row>
                    <ID><xsl:value-of select="ID"/></ID>
                    <!-- 遍历当前行的所有列节点(排除ID节点) -->
                    <xsl:for-each select="*[not(local-name()='ID')]">
                        <xsl:variable name="colName" select="local-name()"/>
                        <!-- 取同组内该列的第一个非空有效值 -->
                        <xsl:variable name="colValue" select="$currentGroup/*[local-name()=$colName][normalize-space(.)!=''][1]"/>
                        <xsl:element name="{$colName}">
                            <xsl:choose>
                                <xsl:when test="$colValue">
                                    <xsl:value-of select="$colValue"/>
                                </xsl:when>
                                <xsl:otherwise>N</xsl:otherwise>
                            </xsl:choose>
                        </xsl:element>
                    </xsl:for-each>
                </row>
            </xsl:for-each>
        </OBR>
    </xsl:template>
</xsl:stylesheet>

XSLT 2.0 简化实现(运行环境支持2.0时优先使用)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/OBR">
        <OBR>
            <xsl:for-each-group select="row" group-by="ID">
                <row>
                    <ID><xsl:value-of select="current-grouping-key()"/></ID>
                    <xsl:for-each select="*[not(local-name()='ID')]">
                        <xsl:variable name="colName" select="local-name()"/>
                        <xsl:variable name="colValue" select="current-group()/*[local-name()=$colName][normalize-space(.)!=''][1]"/>
                        <xsl:element name="{$colName}">
                            <xsl:value-of select="if ($colValue) then $colValue else 'N'"/>
                        </xsl:element>
                    </xsl:for-each>
                </row>
            </xsl:for-each-group>
        </OBR>
    </xsl:template>
</xsl:stylesheet>

补充说明

你给出的期望输出中第二个ID值125659属于笔误,上述代码会保留原始输入的ID值123456,如果需要修改ID生成规则可自行调整对应逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:27:03