XSLT 2.0 或 XSLT3.0:基于相同的值将节点分组和合并在一起

XSLT 2.0 or XSLT3.0: Group and Merge nodes together based on same value

提问人:MAT0718 提问时间:11/8/2023 最后编辑:MAT0718 更新时间:11/8/2023 访问量:49

问:

在转换下面的xml时,我一直无法获得所需的输出。在过去的几天里,我发布了几个类似的问题。我收到的解决方案将获得我在这些问题中提供的源 XML 的所需输出。但是,自从我发布上一个问题以来,我的源 XML 略有变化,这是源 XML 的最终版本。

源 XML

<?xml version="1.0" encoding="UTF-8"?>
<Workers>
    <Worker>
        <UniqueID>67896</UniqueID>
        <ExpenseAmount>400.00</ExpenseAmount>
        <BonusAmount>230.00</BonusAmount>
    </Worker>
    <Worker>
        <UniqueID>12465</UniqueID>
        <ExpenseAmount>500.00</ExpenseAmount>
        <BonusAmount>430.00</BonusAmount>
    </Worker>
    <Worker>
        <UniqueID>71354</UniqueID>
        <ExpenseAmount>998.00</ExpenseAmount>
        <Misc>
            <Date>2023-10-10-07:00</Date>
            <BonusAmount>400.00</BonusAmount>
        </Misc>
        <Misc>
            <Date>2023-10-10-07:00</Date>
            <BonusAmount>520.00</BonusAmount>
        </Misc>
        <Misc>
            <Date>2023-10-09-07:00</Date>
            <BonusAmount>900.00</BonusAmount>
        </Misc>
    </Worker>
    <Worker>
        <UniqueID>45679</UniqueID>
        <ExpenseAmount>1507.00</ExpenseAmount>
        <Misc>
            <Date>2023-10-06-07:00</Date>
            <BonusAmount>322.00</BonusAmount>
        </Misc>
        <Misc>
            <Date>2023-10-08-07:00</Date>
            <BonusAmount>800.00</BonusAmount>
        </Misc>
        <Misc>
            <Date>2023-10-09-07:00</Date>
            <BonusAmount>410.00</BonusAmount>
        </Misc>
        <Misc>
            <Date>2023-10-10-07:00</Date>
            <BonusAmount>600.00</BonusAmount>
        </Misc>
    </Worker>
</Workers>

要求

  • 在源 XML 中,节点下的元素值不会在源 xml 中重复<UniqueID><Worker>

  • 整个文档中有 4 个不同的日期,例如 .由于我的最终输出应该基于我的源 xml 上有 4 个不同的日期进行分组,因此我的预期结果应该有 4 个节点,每个节点都应该包含对应于2023-10-10-07:002023-10-09-07:002023-10-08-07:002023-10-06-07:00<Date><EmployeeRecords><Employee><Date><Worker>

  • 在源 XML 中,节点可能包含节点,也可能不包含节点。任何没有节点的节点都应复制到预期输出中的所有节点下<Worker><Misc>WorkerMiscEmployeeRecords

  • 在源 XML 中,特定节点下的节点可能与该特定节点下的其他节点不同。<Misc><Worker><Date><BonusAmount>MiscWorker

  • 在源XML中,可以有多个节点,例如,在节点下具有相同的节点 有两个相同但不同的节点MiscDateWorkerUniqueIDUniqueID71354<Misc>DateBonusAmount

当前 XSLT

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    
    <xsl:template match="/Workers">
        
        <Employees>
            <xsl:variable name="undated" select="Worker[not(Misc)]"/>
            <xsl:for-each-group select="Worker/Misc" group-by="Date">
                <EmployeeRecords>
                    <xsl:copy-of select="$undated"/>
                    <xsl:copy-of select="..[not(Misc)]/(* except Misc)"/>
                    <xsl:for-each select="current-group()">
                        <Employee>
                            <xsl:for-each select=".">
                                <xsl:copy-of select="..[Misc]/(* except Misc)"/>
                                <xsl:copy-of select="."/>
                            </xsl:for-each>
                        </Employee>
                    </xsl:for-each>
                </EmployeeRecords>
            </xsl:for-each-group>
        </Employees>
        
    </xsl:template>
</xsl:stylesheet>

电流输出

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <EmployeeRecords>
        <Worker> <!-- name of this element should be <Employee> instead of <Worker> -->
            <UniqueID>67896</UniqueID>
            <ExpenseAmount>400.00</ExpenseAmount>
            <BonusAmount>230.00</BonusAmount>
        </Worker>
        <Worker> <!-- name of this element should be <Employee> instead of <Worker> -->
            <UniqueID>12465</UniqueID>
            <ExpenseAmount>500.00</ExpenseAmount>
            <BonusAmount>430.00</BonusAmount>
        </Worker>
        <Employee>
            <UniqueID>71354</UniqueID>
            <ExpenseAmount>998.00</ExpenseAmount>
            <Misc> <!-- Misc node that follow this node should be copied under the parent <Employee> node because of same Unique ID 71354 and same <Date> -->
                <Date>2023-10-10-07:00</Date>
                <BonusAmount>400.00</BonusAmount>
            </Misc>
        </Employee>
        <Employee>
            <UniqueID>71354</UniqueID>
            <ExpenseAmount>998.00</ExpenseAmount>
            <Misc>  <!-- This Misc node should be copied above because of same Unique ID 71354 and same <Date> -->
                <Date>2023-10-10-07:00</Date>
                <BonusAmount>520.00</BonusAmount>
            </Misc>
        </Employee>
        <Employee>
            <UniqueID>45679</UniqueID>
            <ExpenseAmount>1507.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-10-07:00</Date>
                <BonusAmount>600.00</BonusAmount>
            </Misc>
        </Employee>
    </EmployeeRecords>
    <EmployeeRecords>
        <Worker>
            <UniqueID>67896</UniqueID>
            <ExpenseAmount>400.00</ExpenseAmount>
            <BonusAmount>230.00</BonusAmount>
        </Worker>
        <Worker>
            <UniqueID>12465</UniqueID>
            <ExpenseAmount>500.00</ExpenseAmount>
            <BonusAmount>430.00</BonusAmount>
        </Worker>
        <Employee>
            <UniqueID>71354</UniqueID>
            <ExpenseAmount>998.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-09-07:00</Date>
                <BonusAmount>900.00</BonusAmount>
            </Misc>
        </Employee>
        <Employee>
            <UniqueID>45679</UniqueID>
            <ExpenseAmount>1507.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-09-07:00</Date>
                <BonusAmount>410.00</BonusAmount>
            </Misc>
        </Employee>
    </EmployeeRecords>
    <EmployeeRecords>
        <Worker>
            <UniqueID>67896</UniqueID>
            <ExpenseAmount>400.00</ExpenseAmount>
            <BonusAmount>230.00</BonusAmount>
        </Worker>
        <Worker>
            <UniqueID>12465</UniqueID>
            <ExpenseAmount>500.00</ExpenseAmount>
            <BonusAmount>430.00</BonusAmount>
        </Worker>
        <Employee>
            <UniqueID>45679</UniqueID>
            <ExpenseAmount>1507.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-06-07:00</Date>
                <BonusAmount>322.00</BonusAmount>
            </Misc>
        </Employee>
    </EmployeeRecords>
    <EmployeeRecords>
        <Worker>
            <UniqueID>67896</UniqueID>
            <ExpenseAmount>400.00</ExpenseAmount>
            <BonusAmount>230.00</BonusAmount>
        </Worker>
        <Worker>
            <UniqueID>12465</UniqueID>
            <ExpenseAmount>500.00</ExpenseAmount>
            <BonusAmount>430.00</BonusAmount>
        </Worker>
        <Employee>
            <UniqueID>45679</UniqueID>
            <ExpenseAmount>1507.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-08-07:00</Date>
                <BonusAmount>800.00</BonusAmount>
            </Misc>
        </Employee>
    </EmployeeRecords>
</Employees>

预期输出

问题

  • 没有节点的元素的名称应该是 ,而不是 。我尝试更改元素名称,但由于变量声明,结果不正确。Misc<Employee>Worker$undated
  • 目前,在我当前的输出中显示了两个节点,值为 so 节点,该节点位于一个节点下,并且应该复制到一个父节点下。EmployeeUniqueID71354MiscWorkerUniqueIDDateEmployee

预期输出

<?xml version="1.0" encoding="UTF-8"?>
<Employees>
    <EmployeeRecords>
        <Employee>
            <UniqueID>67896</UniqueID>
            <ExpenseAmount>400.00</ExpenseAmount>
            <BonusAmount>230.00</BonusAmount>
        </Employee>
        <Employee>
            <UniqueID>12465</UniqueID>
            <ExpenseAmount>500.00</ExpenseAmount>
            <BonusAmount>430.00</BonusAmount>
        </Employee>
        <Employee>
            <UniqueID>71354</UniqueID>
            <ExpenseAmount>998.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-10-07:00</Date>
                <BonusAmount>400.00</BonusAmount>
            </Misc>
            <Misc>
                <Date>2023-10-10-07:00</Date>
                <BonusAmount>520.00</BonusAmount>
            </Misc>
        </Employee>
        <Employee>
            <UniqueID>45679</UniqueID>
            <ExpenseAmount>1507.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-10-07:00</Date>
                <BonusAmount>600.00</BonusAmount>
            </Misc>
        </Employee>
    </EmployeeRecords>
    <EmployeeRecords>
        <Employee>
            <UniqueID>67896</UniqueID>
            <ExpenseAmount>400.00</ExpenseAmount>
            <BonusAmount>230.00</BonusAmount>
        </Employee>
        <Employee>
            <UniqueID>12465</UniqueID>
            <ExpenseAmount>500.00</ExpenseAmount>
            <BonusAmount>430.00</BonusAmount>
        </Employee>
        <Employee>
            <UniqueID>71354</UniqueID>
            <ExpenseAmount>998.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-09-07:00</Date>
                <BonusAmount>900.00</BonusAmount>
            </Misc>
        </Employee>
        <Employee>
            <UniqueID>45679</UniqueID>
            <ExpenseAmount>1507.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-09-07:00</Date>
                <BonusAmount>410.00</BonusAmount>
            </Misc>
        </Employee>
    </EmployeeRecords>
    <EmployeeRecords>
        <Employee>
            <UniqueID>67896</UniqueID>
            <ExpenseAmount>400.00</ExpenseAmount>
            <BonusAmount>230.00</BonusAmount>
        </Employee>
        <Employee>
            <UniqueID>12465</UniqueID>
            <ExpenseAmount>500.00</ExpenseAmount>
            <BonusAmount>430.00</BonusAmount>
        </Employee>
        <Employee>
            <UniqueID>45679</UniqueID>
            <ExpenseAmount>1507.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-06-07:00</Date>
                <BonusAmount>322.00</BonusAmount>
            </Misc>
        </Employee>
    </EmployeeRecords>
    <EmployeeRecords>
        <Employee>
            <UniqueID>67896</UniqueID>
            <ExpenseAmount>400.00</ExpenseAmount>
            <BonusAmount>230.00</BonusAmount>
        </Employee>
        <Employee>
            <UniqueID>12465</UniqueID>
            <ExpenseAmount>500.00</ExpenseAmount>
            <BonusAmount>430.00</BonusAmount>
        </Employee>
        <Employee>
            <UniqueID>45679</UniqueID>
            <ExpenseAmount>1507.00</ExpenseAmount>
            <Misc>
                <Date>2023-10-08-07:00</Date>
                <BonusAmount>800.00</BonusAmount>
            </Misc>
        </Employee>
    </EmployeeRecords>
</Employees>

我使用的应用程序同时支持 XSLT 2.0 和 XSLT 3.0,因此我将问题标记为 XSLT 2.0 和 3.0

感谢此处提供任何帮助以解决问题。谢谢

XSLT-3.0

评论

0赞 MrD at KookerellaLtd 11/9/2023
我认为你的问题太复杂了,不适合作为一个问题,也许你应该用一个非常简单的问题来重新构建它(基本上是一样的,但没有绒毛)。最好用一个简单的例子来问一个关于如何实现一些一般目标的问题,而不是要求人们为你调试你的复杂代码。

答: 暂无答案