XSLT 聚合数据并以 CSV 格式输出

问题描述 投票:0回答:1

我正在将 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>&#13;&#10;</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>)
xml xslt
1个回答
0
投票

我希望看到

<xsl:variable name="XYZ" select="Part_name"/>

而不是

<xsl:variable name="XYZ" select="."/>

因为上下文项是一个具有复杂内容的

<Part>
元素。

但是由于您从未真正使用过调用

key()
的结果,所以这一切都是无关紧要的。

这看起来像是第一次尝试使用 Muenchian 分组,但没有真正理解它是如何工作的。

© www.soinside.com 2019 - 2024. All rights reserved.