我正在将 XML 文件解析为新的 XML 文件,其中仅包含我需要的数据,其结构更接近我需要的最终结果。从第二个 XML 中,我运行第二个 XSLT 来获取我需要的 CSV 文件。 我的第一个 XSLT 为我提供了一个正确的 XML,没有问题,但如果需要,我可以重新格式化它。 我只需要第二个 XSLT 的帮助,但我在使用“密钥”时迷失了方向。 我正在使用 Xalan 处理器。
这是我需要解析的第二个 XML 的摘录(通常有更多的“部分”):
<?xml version="1.0" encoding="UTF-8"?>
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="xfatcom2.xsd" generated="2023-12-20T10:00:15.173" version="2.0">
<Project_number>21534</Project_number>
<Batch>
<Batch_name>FE20A00</Batch_name>
<Part>
<Part_name>CEA70064DRHBK</Part_name>
<Part_bar_qty>2</Part_bar_qty>
<Part_perc_scrap>0,26484</Part_perc_scrap>
</Part>
<Part>
<Part_name>CEB24037</Part_name>
<Part_bar_qty>1</Part_bar_qty>
<Part_perc_scrap>0,94724</Part_perc_scrap>
</Part>
</Batch>
<Batch>
<Batch_name>FE20A00</Batch_name>
<Part>
<Part_name>CEA70064DRHBK</Part_name>
<Part_bar_qty>2</Part_bar_qty>
<Part_perc_scrap>0,215</Part_perc_scrap>
</Part>
<Part>
<Part_name>CEB24037</Part_name>
<Part_bar_qty>3</Part_bar_qty>
<Part_perc_scrap>0,35514</Part_perc_scrap>
</Part>
</Batch>
<Batch>
<Batch_name>FE30A00</Batch_name>
<Part>
<Part_name>CEA70064DRHBK</Part_name>
<Part_bar_qty>2</Part_bar_qty>
<Part_perc_scrap>0,11211</Part_perc_scrap>
</Part>
<Part>
<Part_name>CEB24037</Part_name>
<Part_bar_qty>12</Part_bar_qty>
<Part_perc_scrap>0,17375</Part_perc_scrap>
</Part>
</Batch>
</Project>
这是我目前在 XSL 中的内容:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common">
<xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes" indent="no" />
<xsl:include href="PontEpicorCommons.xsl"/>
<xsl:key name="PartKey" match="Part" use="Part_name"/>
<xsl:template match="Project">
<!-- Header -->
<xsl:text>Project.ProjectID;ProjPhase.PhaseID;UD_PartNum_C;UD_WitnessQty_c;UD_OptimisedPerc_c</xsl:text>
<xsl:variable name="Project_number" select="Project_number"/><!-- Project number -->
<xsl:for-each select="Batch">
<xsl:variable name="Batch_name" select="Batch_name"/>
<xsl:for-each select="Part">
<!-- testing building the output -->
<xsl:variable name="XYZ" select="."/>
<xsl:variable name="Part_Key" select="key('PartKey', $XYZ)"/>
<xsl:variable name="" select=""/>
<xsl:variable name="" select=""/>
<xsl:variable name="" select=""/>
<xsl:variable name="" select=""/>
<xsl:text> </xsl:text>
<xsl:variable name="Part_name" select="Part_name"/><!-- part name must not be duplicate, use 'key' -->
<xsl:variable name="Part_bar_qty" select="Part_bar_qty"/>
<xsl:variable name="Part_perc_scrap" select="Part_perc_scrap"/>
<!-- A - Project.ProjectID -->
<xsl:value-of select="$Project_number"/>
<xsl:text>;</xsl:text>
<!-- B - ProjPhase.PhaseID -->
<xsl:value-of select="$Batch_name"/>
<xsl:text>;</xsl:text>
<!-- C - UD_PartNum_c -->
<xsl:value-of select="$Part_name"/>
<xsl:text>;</xsl:text>
<!-- D - UD_WitnessQty_c -->
<xsl:value-of select="$Part_bar_qty"/><!-- need total of all same shipping batch -->
<xsl:text>;</xsl:text>
<!-- E - UD_OptimisedPerc_c -->
<xsl:value-of select="$Part_perc_scrap"/><!-- need weighted average (by bar qty) of all same shipping batch -->
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
这是我想要的 CSV 输出:
Project.ProjectID;ProjPhase.PhaseID;UD_PartNum_C;UD_WitnessQty_c;UD_OptimisedPerc_c
21534;FE20A00;CEA70064DRHBK;4;0,23992
21534;FE20A00;CEB24037;4;0,503165
21534;FE30A00;CEA70064DRHBK;2;0,11211
21534;FE30A00;CEB24037;12;0,17375
输出格式说明:
1st line is just the column names
The rest is:
1st column <Project_number>
2nd column <Batch_name>
3rd column <Part_name>
4th column <Part_bar_qty> (total from all the <Batch> having the same <Batch_name>)
5th column <Part_perc_scrap> (weighted average by <Part_bar_qty> for all <Batch> having the same <Batch_name>)
我希望看到
<xsl:variable name="XYZ" select="Part_name"/>
而不是
<xsl:variable name="XYZ" select="."/>
因为上下文项是一个具有复杂内容的
<Part>
元素。
但是由于您从未真正使用过调用
key()
的结果,所以这一切都是无关紧要的。
这看起来像是第一次尝试使用 Muenchian 分组,但没有真正理解它是如何工作的。