XSLT 按唯一参数分组

Posted

技术标签:

【中文标题】XSLT 按唯一参数分组【英文标题】:XSLT Group by unique parameter 【发布时间】:2022-01-01 23:54:16 【问题描述】:

我正在尝试使用基于 RAPID_ID 的每个组逻辑的 xslt 将输入 xml 值转换为输出 xml

Input.xml

<?xml version="1.0" encoding="UTF-8" ?>
<Response>
    <Output>
        <ID>1234</ID>
        <CustomerName>KUMAR</CustomerName>
        <BranchName>HARBOUR</BranchName>
        <SchemeName>GOLD</SchemeName>
        <MobileNumber>123456789</MobileNumber>
        <CustomerType>PRIMARY</CustomerType>
        <DedupeFound>NO</DedupeFound>
    </Output>
    <Output>
        <ID>1234</ID>
        <CustomerName>SEAN</CustomerName>
        <BranchName>HARBOUR</BranchName>
        <SchemeName>GOLD</SchemeName>
        <MobileNumber>123456789</MobileNumber>
        <CustomerType>SECONDARY</CustomerType>
        <DedupeFound>YES</DedupeFound>
    </Output>
    <Output>
        <ID>5678</ID>
        <CustomerName>MARK</CustomerName>
        <BranchName>CANTONMENT</BranchName>
        <SchemeName>DIAMOND</SchemeName>
        <MobileNumber>123456789</MobileNumber>
        <CustomerType>PRIMARY</CustomerType>
        <DedupeFound>NO</DedupeFound>
    </Output>
    <Output>
        <ID>5678</ID>
        <CustomerName>STEVE</CustomerName>
        <BranchName>CANTONMENT</BranchName>
        <SchemeName>DIAMOND</SchemeName>
        <MobileNumber>123456789</MobileNumber>
        <CustomerType>SECONDARY</CustomerType>
        <DedupeFound>YES</DedupeFound>
    </Output>
</Response>

我的预期输出是

输出.xml

<?xml version="1.0" encoding="UTF-8" ?>
<Response>
    <Output>
        <ID>1234</ID>
        <CustomerName>KUMAR</CustomerName>
        <BranchName>HARBOUR</BranchName>
        <SchemeName>GOLD</SchemeName>
        <MobileNumber>123456789</MobileNumber>
        <DedupeDetails>
            <CustomerType>PRIMARY</CustomerType>
            <CustomerName>KUMAR</CustomerName>
            <DedupeFound>NO</DedupeFound>
        </DedupeDetails>
        <DedupeDetails>
            <CustomerType>SECONDARY</CustomerType>
            <CustomerName>SEAN</CustomerName>
            <DedupeFound>YES</DedupeFound>
        </DedupeDetails>
    </Output>
    <Output>
        <ID>5678</ID>
        <CustomerName>MARK</CustomerName>
        <BranchName>CANTONMENT</BranchName>
        <SchemeName>DIAMOND</SchemeName>
        <MobileNumber>123456789</MobileNumber>
        <DedupeDetails>
            <CustomerType>PRIMARY</CustomerType>
            <CustomerName>MARK</CustomerName>
            <DedupeFound>NO</DedupeFound>
        </DedupeDetails>
        <DedupeDetails>
            <CustomerType>SECONDARY</CustomerType>
            <CustomerName>STEVE</CustomerName>
            <DedupeFound>YES</DedupeFound>
        </DedupeDetails>
    </Output>
</Response>

我从这样的事情开始,但无法继续进行。 我试图首先对 ID 参数进行分组,在里面它从主要客户详细信息开始。 在主要客户详细信息之后,我必须迭代每个客户(这里主要和次要)

任何建议/更正以实现这一目标。

我的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <Response>
     <xsl:for-each-group select="/Response/Output" group-by="ID">
      <xsl:sort select="ID"/>


    </xsl:for-each-group>
            
        </Response>
    </xsl:template>

</xsl:stylesheet>

【问题讨论】:

抱歉,您的 XML 示例中没有 RAPID_ID,因此 XSLT 对于您显示的输入示例没有任何意义。 @MartinHonnen 道歉。我已经更正了 xslt。我最初粘贴了不同版本的 xslt。 好吧。 &lt;xsl:for-each-group select="/Response/Output" group-by="ID"&gt; 看起来不错,但是如果你不创建任何内容就没有任何内容,所以至少&lt;xsl:copy&gt;...&lt;/xsl:copy&gt; 将构成for-each-group 的内容,为每个组创建一个输出。然后根据需要填充您需要的元素并根据current-group() 处理组中的不同项目 【参考方案1】:

我会采取不同的方法:

XSLT 1.0

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

<xsl:key name="op" match="Output" use="ID"/>

<xsl:template match="/Response">
    <xsl:copy>
        <xsl:for-each select="Output[CustomerType='PRIMARY']">
            <xsl:copy>
                <xsl:copy-of select="ID|CustomerName|BranchName|SchemeName"/>
                <xsl:for-each select="key('op', ID)">
                    <DedupeDetails>
                        <xsl:copy-of select="CustomerType|CustomerName|DedupeFound"/>
                    </DedupeDetails>
                </xsl:for-each>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

请注意,这假设每个组恰好有一个 PRIMARY 客户和零个或多个 SECONDARY 客户。如果输入总是有一个主要客户,然后是一个次要客户,就像您的示例一样,那么这可能会更简单。

【讨论】:

嗨,米歇尔。我会尝试你的方法并让你知道。你的假设是对的。输入有一个主要和多个辅助

以上是关于XSLT 按唯一参数分组的主要内容,如果未能解决你的问题,请参考以下文章

XSLT,按年份排序和分组

如何使用 Muenchian 分组 XSLT 1.0 在每个目录中按标题分组

如何在下面的 XSLT 1.0 代码中进行分组。需要按 TaxRateCode 分组

XSLT 1.0 - 连接已知子节点,按未知父节点分组

在xslt中对缺少的表元素进行分组和填充

Pandas:按两个参数分组并按第三个参数排序