0

我在 XML 文件中有以下结构,我想在其中合并所有子节点,前提是它们具有相同的父节点。我也想删除重复项。我还提供了输入 XML 和所需输出的示例。在下面的示例中,我想合并所有与地址相关的属性和标识符,因为两个节点的 CUST_NM 字段相同。

<root>
<Objects>
    <CUST_NUM>
        MC0000289917
    </CUST_NUM>
    <FIRST_Nm>
        RONALD
    </FIRST_Nm>
    <Address>   
        <Addr_line_1>
            5655 HUDSON DR
        </Addr_line_1>   
        <Addr_line_2>
            STE 130
        </Addr_line_2>   
    </Address>
    <Identifier>
        <ID_TYP_CD>
            SLN
        </ID_TYP_CD>
        <ID_VAL>
            35
        </ID_VAL>
    </Identifier>
</Objects>
<Objects>
    <CUST_NUM>
        MC0000289917
    </CUST_NUM>
    <FIRST_Nm>
        RONALD
    </FIRST_Nm>
    <Address>   
        <Addr_line_1>
            568 HUDSON DR1
        </Addr_line_1>   
        <Addr_line_2>
            STE 132
        </Addr_line_2>   
    </Address>
    <Identifier>
        <ID_TYP_CD>
           SLN
    </ID_TYP_CD>
    <ID_VAL>
        35
    </ID_VAL>
</Identifier>

期望的输出:

<root>
<Objects>
    <CUST_NUM>
        MC0000289917
    </CUST_NUM>
    <FIRST_Nm>
        RONALD
    </FIRST_Nm>
    <Address>   
        <Addr_line_1>
            5655 HUDSON DR
            568 HUDSON DR1
        </Addr_line_1>   
        <Addr_line_2>
            STE 130
            STE 132
        </Addr_line_2>   
    </Address>
    <Identifier>
        <ID_TYP_CD>
            SLN
        </ID_TYP_CD>
        <ID_VAL>
            35
        </ID_VAL>
    </Identifier>
</Objects>

4

1 回答 1

0

这似乎是一项group by重复使用的任务:

/* ! element { node-name() } {
    for $obj in Objects
    group by $cust-no := $obj/CUST_NUM
    return
        <OBJECTS>
        {
            for $child at $pos in $obj/*
            group by $name := node-name($child)
            order by head($pos)
            return 
                element { $name } { 
                    if ($child/*)
                    then for $grand-child at $gpos in $child/*
                         group by $gc-name := node-name($grand-child)
                         order by head($gpos)
                         return 
                             element { $gc-name } { distinct-values($grand-child ! normalize-space(data())) }
                    else distinct-values($child/data()) 
                }
        }
        </OBJECTS>
}

https://xqueryfiddle.liberty-development.net/3NzcBsC

于 2019-11-14T11:14:43.680 回答