使用 XSLT 组合具有相同 ID 及其值的节点 (XML)

Posted

技术标签:

【中文标题】使用 XSLT 组合具有相同 ID 及其值的节点 (XML)【英文标题】:Combine Nodes (XML) with the same ID and their values using XSLT 【发布时间】:2021-12-29 03:56:04 【问题描述】:

我是 XSLT 的新手,我还在学习。我目前面临一个问题,我需要组合具有相同 ID 的节点。 ID相同的节点会有不同的值,这些值也需要组合起来。

下面是我的初始示例 XML:

<OBR>
 <row>
    <ID>T084</ID>
    <col2>Y</col2>
    <col3></col3>
    <col4></col4>
 </row>
 <row>
    <ID>T084</ID>
    <col2></col2>
    <col3>Y</col3>
    <col4></col4>
 </row>
 <row>
    <ID>123456</ID>
    <col2></col2>
    <col3>Y</col3>
    <col4></col4>
 </row>
</OBR>

鉴于我需要用“N”填充空值,我的期望输出将是:

<OBR>
 <row>
    <ID>T084</ID>
    <col2>Y</col2>
    <col3>Y</col3>
    <col4>N</col4>
 </row>
 <row>
    <ID>125659</ID>
    <col2>N</col2>
    <col3>Y</col3>
    <col4>N</col4>
 </row>
</OBR>

谁能指出我正确的方向?提前谢谢你。

【问题讨论】:

查看任何关于分组的介绍和示例,例如此站点上的***.com/tags/xslt-grouping/info,然后用一些代码尝试一下。如果您遇到问题,请发布详细信息(最少但完整的 XML 和 XSLT、您想要的输出、您获得的错误或错误输出)以及有关使用的 XSLT 处理器的信息。 【参考方案1】:

看来您需要在两个级别上进行分组:

XSLT 2.0

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

<xsl:template match="/OBR">
    <xsl:copy>
        <xsl:for-each-group select="row" group-by="ID">
            <xsl:copy>
                <xsl:for-each-group select="current-group()/*" group-by="name()">
                    <xsl:element name="current-grouping-key()">
                        <xsl:value-of select="(current-group()/text(), 'N')[1]"/>
                    </xsl:element>
                </xsl:for-each-group>
            </xsl:copy>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

【讨论】:

以上是关于使用 XSLT 组合具有相同 ID 及其值的节点 (XML)的主要内容,如果未能解决你的问题,请参考以下文章

如何合并具有“相同父亲”、相同方法和相同 id=0 的两个节点(使用 XSLT)?

具有相同级别下重复节点的 XSLT 变换

使用 XSLT 将具有相同 ID 的元素 (XML) 合并到 txt 文件

在 XSLT 中,如何使用存在多个相同节点的 ID 从节点中选择一个值?

使用 xslt 2.0 合并具有相同父属性值的元素的 xml 内容

如何合并具有“相同父亲”和具有精确“方法”序列的两个节点(使用 XSLT)?