如何使用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
相关产品推荐
相关产品推荐

