XSLT帮助-将字段映射存储到变量中,并根据该映射对输入有效负载进行分组

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

我有一个XML文件,需要将其转换为管道分隔的文本文件。另外,该xml包含旧版支付代码,需要将其转换为输出文件中的将来状态代码。这些代码之间以1:1或M:1进行映射,例如,如果4行具有不同代码的输入数据对应于将来状态下的一个代码,则输出应产生一行并累加起来的数量。这是一个例子,

xml:

<?xml version="1.0" encoding="UTF-8"?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/ERP-PAY-CR_PAYROLL_BALANCES_-_CX">
<wd:Report_Entry>
<wd:Legal_Entity_Name wd:Descriptor="Wayne Enterprises">
<wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
<wd:ID wd:type="Organization_Reference_ID">G01A</wd:ID>
<wd:ID wd:type="Company_Reference_ID">G01A</wd:ID>
</wd:Legal_Entity_Name>
<wd:Person_Number>2100003</wd:Person_Number>
<wd:Calendar_Quarter wd:Descriptor="2019-Q1">
<wd:ID wd:type="WID">da9970b23fce10001102e89a634e0024</wd:ID>
<wd:ID wd:type="Calendar_Quarter">2019-Q1</wd:ID>
</wd:Calendar_Quarter>
<wd:Pay_Component_Code>102</wd:Pay_Component_Code>
<wd:Result_Line_Amount>14326.91</wd:Result_Line_Amount>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Legal_Entity_Name wd:Descriptor="Wayne Enterprises">
<wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
<wd:ID wd:type="Organization_Reference_ID">G01A</wd:ID>
<wd:ID wd:type="Company_Reference_ID">G01A</wd:ID>
</wd:Legal_Entity_Name>
<wd:Person_Number>2100003</wd:Person_Number>
<wd:Calendar_Quarter wd:Descriptor="2019-Q1">
<wd:ID wd:type="WID">da9970b23fce10001102e89a634e0024</wd:ID>
<wd:ID wd:type="Calendar_Quarter">2019-Q1</wd:ID>
</wd:Calendar_Quarter>
<wd:Pay_Component_Code>123</wd:Pay_Component_Code>
<wd:Result_Line_Amount>1175.56</wd:Result_Line_Amount>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Legal_Entity_Name wd:Descriptor="Wayne Enterprises">
<wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
<wd:ID wd:type="Organization_Reference_ID">G01A</wd:ID>
<wd:ID wd:type="Company_Reference_ID">G01A</wd:ID>
</wd:Legal_Entity_Name>
<wd:Person_Number>2100003</wd:Person_Number>
<wd:Calendar_Quarter wd:Descriptor="2019-Q1">
<wd:ID wd:type="WID">da9970b23fce10001102e89a634e0024</wd:ID>
<wd:ID wd:type="Calendar_Quarter">2019-Q1</wd:ID>
</wd:Calendar_Quarter>
<wd:Pay_Component_Code>126</wd:Pay_Component_Code>
<wd:Result_Line_Amount>2350.74</wd:Result_Line_Amount>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Legal_Entity_Name wd:Descriptor="Wayne Enterprises">
<wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
<wd:ID wd:type="Organization_Reference_ID">G01A</wd:ID>
<wd:ID wd:type="Company_Reference_ID">G01A</wd:ID>
</wd:Legal_Entity_Name>
<wd:Person_Number>2100003</wd:Person_Number>
<wd:Calendar_Quarter wd:Descriptor="2019-Q1">
<wd:ID wd:type="WID">da9970b23fce10001102e89a634e0024</wd:ID>
<wd:ID wd:type="Calendar_Quarter">2019-Q1</wd:ID>
</wd:Calendar_Quarter>
<wd:Pay_Component_Code>217</wd:Pay_Component_Code>
<wd:Result_Line_Amount>0.85</wd:Result_Line_Amount>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Legal_Entity_Name wd:Descriptor="Wayne Enterprises">
<wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
<wd:ID wd:type="Organization_Reference_ID">G01A</wd:ID>
<wd:ID wd:type="Company_Reference_ID">G01A</wd:ID>
</wd:Legal_Entity_Name>
<wd:Person_Number>2100003</wd:Person_Number>
<wd:Calendar_Quarter wd:Descriptor="2019-Q1">
<wd:ID wd:type="WID">da9970b23fce10001102e89a634e0024</wd:ID>
<wd:ID wd:type="Calendar_Quarter">2019-Q1</wd:ID>
</wd:Calendar_Quarter>
<wd:Pay_Component_Code>225</wd:Pay_Component_Code>
<wd:Result_Line_Amount>1.03</wd:Result_Line_Amount>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Legal_Entity_Name wd:Descriptor="Wayne Enterprises">
<wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
<wd:ID wd:type="Organization_Reference_ID">G01A</wd:ID>
<wd:ID wd:type="Company_Reference_ID">G01A</wd:ID>
</wd:Legal_Entity_Name>
<wd:Person_Number>2100003</wd:Person_Number>
<wd:Calendar_Quarter wd:Descriptor="2019-Q1">
<wd:ID wd:type="WID">da9970b23fce10001102e89a634e0024</wd:ID>
<wd:ID wd:type="Calendar_Quarter">2019-Q1</wd:ID>
</wd:Calendar_Quarter>
<wd:Pay_Component_Code>353</wd:Pay_Component_Code>
<wd:Result_Line_Amount>21.84</wd:Result_Line_Amount>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Legal_Entity_Name wd:Descriptor="Wayne Enterprises">
<wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
<wd:ID wd:type="Organization_Reference_ID">G01A</wd:ID>
<wd:ID wd:type="Company_Reference_ID">G01A</wd:ID>
</wd:Legal_Entity_Name>
<wd:Person_Number>2100003</wd:Person_Number>
<wd:Calendar_Quarter wd:Descriptor="2019-Q1">
<wd:ID wd:type="WID">da9970b23fce10001102e89a634e0024</wd:ID>
<wd:ID wd:type="Calendar_Quarter">2019-Q1</wd:ID>
</wd:Calendar_Quarter>
<wd:Pay_Component_Code>420</wd:Pay_Component_Code>
<wd:Result_Line_Amount>1632.61</wd:Result_Line_Amount>
</wd:Report_Entry>

</wd:Report_Data>

映射参考:

Legacy Codes   Future State Values
102            Regular
123            Regular
126            Regular
217            Diff Shift Prod
225            Diff Shift Prod
353            PTO Donation
420            PTO Donation

预期输出:

Legal Entity Name|Person Number|Calendar Quarter|Pay Component Code|Result Line Amount
Wayne Enterprises|2100003|2019-Q1|Regular|17853.21
Wayne Enterprises|2100003|2019-Q1|Diff Shift Prod|1.88
Wayne Enterprises|2100003|2019-Q1|PTO Donation|1654.45

基本上,我设想的方式是创建一个映射变量,我可以对代码中的所有映射进行硬编码,并根据新代码对数量进行分组。附加我的xsl代码(如果有帮助)。非常感谢您的帮助。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    xmlns:wd="urn:com.workday.report/ERP-PAY-CR_PAYROLL_BALANCES_-_CX"
    version="2.0">
    <xsl:output method="text"/>
    <xsl:variable name="linefeed" select="'&#xD;&#xA;'"/>
    <xsl:variable name="pipe" select="'|'"/>
    <xsl:variable name="EffectiveStartDate" select="'1951-01-01'"/>
    <xsl:variable name="EffectiveEndDate" select="'4712-12-31'"/>

    <xsl:param name="quote">"</xsl:param>
    <xsl:template match="/">
        <!--  File Header Record  -->
        <!-- ERP1 -->
        <xsl:call-template name="Write-Header-Record0"/>
        <!--  File Detail Layout  -->
        <xsl:for-each
            select="wd:Report_Data/wd:Report_Entry">

                <xsl:call-template name="Write-Detail-Record"/>

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

    <!-- File Header Record 0-->
    <xsl:template name="Write-Header-Record0">

        <xsl:text>Legal Entity Name|Person Number|Calendar Quarter|Pay Component Code|Result Line Amount</xsl:text>

        <xsl:value-of select="$linefeed"/>
    </xsl:template>

    <xsl:template name="Write-Detail-Record">

        <xsl:value-of select="wd:Legal_Entity_Name/@wd:Descriptor"/>
        <xsl:value-of select="$pipe"/>

        <xsl:value-of select="wd:Person_Number"/>
        <xsl:value-of select="$pipe"/>

        <xsl:value-of select="wd:Calendar_Quarter/@wd:Descriptor"/>
        <xsl:value-of select="$pipe"/>

        <xsl:value-of select="wd:Pay_Component_Code"/>
        <xsl:value-of select="$pipe"/>

        <xsl:value-of select="wd:Result_Line_Amount"/>



        <xsl:value-of select="$linefeed"/>


    </xsl:template>

</xsl:stylesheet>
xslt xslt-2.0 xslt-grouping
1个回答
0
投票

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="urn:com.workday.report/ERP-PAY-CR_PAYROLL_BALANCES_-_CX"> <xsl:output method="text"/> <xsl:variable name="payCodes"> <payCode name="Regular"> <legacyCode>102</legacyCode> <legacyCode>123</legacyCode> <legacyCode>126</legacyCode> </payCode> <payCode name="Diff Shift Prod"> <legacyCode>217</legacyCode> <legacyCode>225</legacyCode> </payCode> <payCode name="PTO Donation"> <legacyCode>353</legacyCode> <legacyCode>420</legacyCode> </payCode> </xsl:variable> <xsl:key name="paycode" match="payCode" use="legacyCode" /> <xsl:template match="/wd:Report_Data"> <xsl:variable name="common"> <xsl:value-of select="wd:Report_Entry[1]/wd:Legal_Entity_Name/@wd:Descriptor"/> <xsl:text>|</xsl:text> <xsl:value-of select="wd:Report_Entry[1]/wd:Person_Number"/> <xsl:text>|</xsl:text> <xsl:value-of select="wd:Report_Entry[1]/wd:Calendar_Quarter/@wd:Descriptor"/> <xsl:text>|</xsl:text> </xsl:variable> <!-- HEADER --> <xsl:text>Legal Entity Name|Person Number|Calendar Quarter|Pay Component Code|Result Line Amount&#xD;&#xA;</xsl:text> <!-- DATA --> <xsl:for-each-group select="wd:Report_Entry" group-by="key('paycode', wd:Pay_Component_Code, $payCodes)"> <xsl:value-of select="$common"/> <xsl:value-of select="key('paycode', wd:Pay_Component_Code, $payCodes)/@name"/> <xsl:text>|</xsl:text> <xsl:value-of select="sum(current-group()/wd:Result_Line_Amount)"/> <xsl:text>&#xD;&#xA;</xsl:text> </xsl:for-each-group> </xsl:template> </xsl:stylesheet>


演示
https://xsltfiddle.liberty-development.net/6pS26mw

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