提问人:MAT0718 提问时间:11/8/2023 最后编辑:MAT0718 更新时间:11/8/2023 访问量:49
XSLT 2.0 或 XSLT3.0:基于相同的值将节点分组和合并在一起
XSLT 2.0 or XSLT3.0: Group and Merge nodes together based on same value
问:
在转换下面的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:00
2023-10-09-07:00
2023-10-08-07:00
2023-10-06-07:00
<Date>
<EmployeeRecords>
<Employee>
<Date>
<Worker>
在源 XML 中,节点可能包含节点,也可能不包含节点。任何没有节点的节点都应复制到预期输出中的所有节点下
<Worker>
<Misc>
Worker
Misc
EmployeeRecords
在源 XML 中,特定节点下的节点可能与该特定节点下的其他节点不同。
<Misc>
<Worker>
<Date>
<BonusAmount>
Misc
Worker
在源XML中,可以有多个节点,例如,在节点下具有相同的节点 有两个相同但不同的节点
Misc
Date
Worker
UniqueID
UniqueID
71354
<Misc>
Date
BonusAmount
当前 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 节点,该节点位于一个节点下,并且应该复制到一个父节点下。
Employee
UniqueID
71354
Misc
Worker
UniqueID
Date
Employee
预期输出
<?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
感谢此处提供任何帮助以解决问题。谢谢
答: 暂无答案
评论