XSLT Help - Создайте в XSLT переменную для хранения сопоставления перекрестных ссылок и группирования элементов ввода на основе этого сопоставления - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть файл зарплаты XML, который содержит дочерний элемент (pay_component_code) для каждой строки позиции. Мне предоставлен картографический документ, содержащий перевод между текущими и будущими кодами, либо 1: 1, либо М: 1. Требуется преобразовать xml в текстовый файл с разделителем по конвейеру, а также агрегировать сумму на основе группировки номера человека, даты вступления в силу и кода компонента оплаты (будущее состояние). Кажется, что xslt у меня отлично работает для выборки, но когда я запускаю программу для другой группы, она выдает ошибку со следующей ошибкой: A sequence of more than one item is not allowed as the first argument of concat() (<payCode/>, <payCode/>) Line: 1786 Column: 11 Я вижу, что это происходит, когда узел в контексте имеет более одного дочернего элемента. Может кто-нибудь объяснить, в чем проблема? Редактор кислорода не очень помог, поскольку он выделяет весь xml, что слишком долго для анализа проблемы root.

Образец xml:

<?xml version='1.0' encoding='UTF-8'?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/ERP_PAY_CR_PAYROLL_BALANCES_LINE_AMT">
    <wd:Report_Entry>
        <wd:Country_Code>US</wd:Country_Code>
        <wd:Entity_Name>BalanceInitialization</wd:Entity_Name>
        <wd:Legislative_Data_Group_Name>US Legislative Data Group</wd:Legislative_Data_Group_Name>
        <wd:Legal_Entity_Name wd:Descriptor="SRMH">
            <wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
            <wd:ID wd:type="Organization_Reference_ID">G123</wd:ID>
            <wd:ID wd:type="Company_Reference_ID">G123</wd:ID>
        </wd:Legal_Entity_Name>
        <wd:Person_Number>2110013</wd:Person_Number>
        <wd:Effective_Date>2020-01-01</wd:Effective_Date>
        <wd:Period>2020-Q1</wd:Period>
        <wd:Dimension>Assignment Tax Unit Quarter to Date</wd:Dimension>
        <wd:Pay_Component_Name>102 Regular - Hourly</wd:Pay_Component_Name>
        <wd:Pay_Component_Code>102</wd:Pay_Component_Code>
        <wd:Number>3143.28</wd:Number>
        <wd:Payroll wd:Descriptor="PSJH Biweekly B">
            <wd:ID wd:type="WID">2d405a8ea1ea01265d95c04def2d96c7</wd:ID>
            <wd:ID wd:type="Evaluate_Expression_Band_Related_Content_Reference_ID"
                >EVALUATE_EXPRESSION_BAND_CALCULATED_FIELD_RELATED_CONTENT-6-2d405a8ea1ea01265d95c04def2d96c7</wd:ID>
        </wd:Payroll>
        <wd:Tax_Reporting_Unit>SJHNC, LLC</wd:Tax_Reporting_Unit>
        <wd:Company_ID>G123</wd:Company_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:Country_Code>US</wd:Country_Code>
        <wd:Entity_Name>BalanceInitialization</wd:Entity_Name>
        <wd:Legislative_Data_Group_Name>US Legislative Data Group</wd:Legislative_Data_Group_Name>
        <wd:Legal_Entity_Name wd:Descriptor="SRMH">
            <wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
            <wd:ID wd:type="Organization_Reference_ID">G123</wd:ID>
            <wd:ID wd:type="Company_Reference_ID">G123</wd:ID>
        </wd:Legal_Entity_Name>
        <wd:Person_Number>2110013</wd:Person_Number>
        <wd:Effective_Date>2020-01-01</wd:Effective_Date>
        <wd:Period>2020-Q1</wd:Period>
        <wd:Dimension>Assignment Tax Unit Quarter to Date</wd:Dimension>
        <wd:Pay_Component_Name>123 Overtime - OT Prem</wd:Pay_Component_Name>
        <wd:Pay_Component_Code>123</wd:Pay_Component_Code>
        <wd:Number>185.31</wd:Number>
        <wd:Payroll wd:Descriptor="PSJH Biweekly B">
            <wd:ID wd:type="WID">2d405a8ea1ea01265d95c04def2d96c7</wd:ID>
            <wd:ID wd:type="Evaluate_Expression_Band_Related_Content_Reference_ID"
                >EVALUATE_EXPRESSION_BAND_CALCULATED_FIELD_RELATED_CONTENT-6-2d405a8ea1ea01265d95c04def2d96c7</wd:ID>
        </wd:Payroll>
        <wd:Tax_Reporting_Unit>SJHNC, LLC</wd:Tax_Reporting_Unit>
        <wd:Company_ID>G123</wd:Company_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:Country_Code>US</wd:Country_Code>
        <wd:Entity_Name>BalanceInitialization</wd:Entity_Name>
        <wd:Legislative_Data_Group_Name>US Legislative Data Group</wd:Legislative_Data_Group_Name>
        <wd:Legal_Entity_Name wd:Descriptor="SRMH">
            <wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
            <wd:ID wd:type="Organization_Reference_ID">G123</wd:ID>
            <wd:ID wd:type="Company_Reference_ID">G123</wd:ID>
        </wd:Legal_Entity_Name>
        <wd:Person_Number>2110013</wd:Person_Number>
        <wd:Effective_Date>2020-01-01</wd:Effective_Date>
        <wd:Period>2020-Q1</wd:Period>
        <wd:Dimension>Assignment Tax Unit Quarter to Date</wd:Dimension>
        <wd:Pay_Component_Name>126 Overtime - OT Base</wd:Pay_Component_Name>
        <wd:Pay_Component_Code>126</wd:Pay_Component_Code>
        <wd:Number>370.61</wd:Number>
        <wd:Payroll wd:Descriptor="PSJH Biweekly B">
            <wd:ID wd:type="WID">2d405a8ea1ea01265d95c04def2d96c7</wd:ID>
            <wd:ID wd:type="Evaluate_Expression_Band_Related_Content_Reference_ID"
                >EVALUATE_EXPRESSION_BAND_CALCULATED_FIELD_RELATED_CONTENT-6-2d405a8ea1ea01265d95c04def2d96c7</wd:ID>
        </wd:Payroll>
        <wd:Tax_Reporting_Unit>SJHNC, LLC</wd:Tax_Reporting_Unit>
        <wd:Company_ID>G123</wd:Company_ID>
    </wd:Report_Entry>
    <wd:Report_Entry>
        <wd:Country_Code>US</wd:Country_Code>
        <wd:Entity_Name>BalanceInitialization</wd:Entity_Name>
        <wd:Legislative_Data_Group_Name>US Legislative Data Group</wd:Legislative_Data_Group_Name>
        <wd:Legal_Entity_Name wd:Descriptor="SRMH">
            <wd:ID wd:type="WID">66b06c2b4ec001df7d2d7875ea020e52</wd:ID>
            <wd:ID wd:type="Organization_Reference_ID">G123</wd:ID>
            <wd:ID wd:type="Company_Reference_ID">G123</wd:ID>
        </wd:Legal_Entity_Name>
        <wd:Person_Number>2110013</wd:Person_Number>
        <wd:Effective_Date>2020-01-01</wd:Effective_Date>
        <wd:Period>2020-Q1</wd:Period>
        <wd:Dimension>Assignment Tax Unit Quarter to Date</wd:Dimension>
        <wd:Pay_Component_Name>420 Time Off - PTO</wd:Pay_Component_Name>
        <wd:Pay_Component_Code>420</wd:Pay_Component_Code>
        <wd:Number>1623.96</wd:Number>
        <wd:Payroll wd:Descriptor="PSJH Biweekly B">
            <wd:ID wd:type="WID">2d405a8ea1ea01265d95c04def2d96c7</wd:ID>
            <wd:ID wd:type="Evaluate_Expression_Band_Related_Content_Reference_ID"
                >EVALUATE_EXPRESSION_BAND_CALCULATED_FIELD_RELATED_CONTENT-6-2d405a8ea1ea01265d95c04def2d96c7</wd:ID>
        </wd:Payroll>
        <wd:Tax_Reporting_Unit>SJHNC, LLC</wd:Tax_Reporting_Unit>
        <wd:Company_ID>G123</wd:Company_ID>
    </wd:Report_Entry>

XSLT:

<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_LINE_AMT">
    <xsl:output method="text"/>

    <xsl:variable name="linefeed" select="'&#xD;&#xA;'"/>
    <xsl:variable name="pipe" select="'|'"/>
    <xsl:param name="quote">"</xsl:param>


    <xsl:variable name="payCodes">

        <payCode name="Admin Leave Paid">
            <legacyCode>400</legacyCode>
            <legacyCode>432</legacyCode>

        <payCode name="Regular">
            <legacyCode>101</legacyCode> 
            <legacyCode>102</legacyCode> 
            <legacyCode>103</legacyCode>
            <legacyCode>112</legacyCode> 
            <legacyCode>800</legacyCode> 
            <legacyCode>964</legacyCode> 
        </payCode>

        <payCode name="Overtime Weekly">
            <legacyCode>126</legacyCode>            
        </payCode>

        <payCode name="Overtime Weekly FLSA">
            <legacyCode>123</legacyCode>            
        </payCode>

        </payCode>
        <payCode name="Bereavement">
            <legacyCode>410</legacyCode>
            <legacyCode>436</legacyCode>
        </payCode>
        <payCode name="Break Penalty">
            <legacyCode>777</legacyCode>            
        </payCode>

        <payCode name="PTO Donation">
            <legacyCode>413</legacyCode>
            <legacyCode>420</legacyCode>
            <legacyCode>422</legacyCode>

        </payCode>

        <payCode name="CA Healthy Family PTO">
            <legacyCode>496</legacyCode>
            <legacyCode>497</legacyCode>  
            <legacyCode>498</legacyCode>
            <legacyCode>499</legacyCode> 
        </payCode>

        <payCode name="Callback 1 5">
            <legacyCode>153</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/wd:Legal_Entity_Name/@wd:Descriptor"/>
                <xsl:text>|</xsl:text>
             <xsl:value-of select="wd:Report_Entry/wd:Person_Number"/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="wd:Report_Entry/wd:Calendar_Quarter/@wd:Descriptor"/>
            <xsl:text>|</xsl:text>
        </xsl:variable> -->

        <!-- HEADER LINE 1-->
        <xsl:text>Country Code|Entity Name|Legislative Data Group Name|Legal Entity Name|Person Number|Effective As Of Date|Assignment Number|Value|Upload Date|Balance|Dimension|Payroll Relationship Number|Term Number|Assignment Number|Legal Employer|Payroll|Area One|Area Two|Area Three|Area Four|Third Party Payee|Time Definition|Calculation Breakdown|Balance Date|Tax Reporting Unit|Run Type|Context One|Context One Value|Context Two|Context Two Value|Context Three|Context Three Value|Context Four|Context Four Value|Context Five|Context Five Value|Context Six|Context Six Value&#xD;&#xA;</xsl:text>

        <!-- HEADER LINE 2-->
        <xsl:text>COUNTRY_CODE|ENTITY_NAME|LEGISLATIVE_DATA_GROUP|LEGAL_ENTITY_NAME|PERSON_NUMBER|EFFECTIVE_DATE|ASSIGNMENT_NUMBER|POSITION2|POSITION3|POSITION4|POSITION5|POSITION6|POSITION7|POSITION8|POSITION9|POSITION10|POSITION11|POSITION12|POSITION13|POSITION14|POSITION15|POSITION16|POSITION17|POSITION18|POSITION19|POSITION20|POSITION21|POSITION22|POSITION23|POSITION24|POSITION25|POSITION26|POSITION27|POSITION28|POSITION29|POSITION30|POSITION31|POSITION32&#xD;&#xA;</xsl:text>

        <!-- HEADER LINE 3 -->
        <xsl:text>VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|DATE|VARCHAR2|NUMBER|DATE|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|DATE|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2|VARCHAR2&#xD;&#xA;</xsl:text>
        <!-- DATA -->

            <xsl:for-each-group select="wd:Report_Entry" group-by="concat(key('paycode', wd:Pay_Component_Code, $payCodes),wd:Person_Number,wd:Effective_Date)">

                <xsl:if test="exists(key('paycode', wd:Pay_Component_Code, $payCodes)/@name)">

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

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

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

                    <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:Effective_Date"/>
                    <xsl:value-of select="$pipe"/>

                    <!-- Assginment Number Place Holder -->
                    <xsl:text>|</xsl:text>

                    <xsl:value-of select="format-number(sum(current-group()/wd:Number),'#.00')"/>
                    <xsl:value-of select="$pipe"/>

                    <!-- Upload Date Place Holder -->
                    <xsl:value-of select="wd:Effective_Date"/>
                    <xsl:text>|</xsl:text>

                    <xsl:value-of select="key('paycode', wd:Pay_Component_Code, $payCodes)/@name"/>
                    <xsl:value-of select="$pipe"/>

                    <!-- Dimension
            <xsl:choose>
                <xsl:when test="exists(wd:Earning)">
                    <xsl:value-of select="concat('Assignment Tax Unit',' ',substring-before(wd:Dimension/@wd:Descriptor,' 20'))"/>
                </xsl:when>

                <xsl:otherwise>
                    <xsl:value-of select="concat('Relationship Tax',' ',substring-before(wd:Dimension/@wd:Descriptor,' 20'))"/>
                </xsl:otherwise>
            </xsl:choose> -->
                    <xsl:value-of select="wd:Dimension"/>
                    <xsl:text>|</xsl:text> 

                    <xsl:value-of select="wd:Person_Number"/>
                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:value-of select="wd:Payroll/@wd:Descriptor"/>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <!-- Balance Date Place Holder -->
                    <xsl:value-of select="wd:Effective_Date"/>
                    <xsl:text>|</xsl:text>

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

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>

                    <xsl:text>|</xsl:text>


                    <xsl:text>&#xD;&#xA;</xsl:text>
                </xsl:if>
            </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

1 Ответ

1 голос
/ 29 апреля 2020

Я не вижу строку 1786 в вашей таблице стилей, но предполагая, что проблема связана с

group-by="concat(key('paycode', wd:Pay_Component_Code, $payCodes),
                 wd:Person_Number, wd:Effective_Date)">

, он жалуется на первый аргумент concat (), говоря, что он содержит последовательность из двух payCode элементов. Но даже если бы он выбрал только один, этот код был бы сомнительным, потому что элемент, выбранный функцией key (), был бы атомизирован, чтобы получить его строковое значение, а строковое значение элемента payCode не имеет ничего особенного. Возможно, это должно быть key(...)/@name?

Кажется, проблема в ваших данных, а не в вашем коде; или, скорее, это из-за предположений, которые ваш код делает относительно ваших данных, в частности уникальности значений. Поэтому я бы предположил, что решение заключается в проверке; более точно определите свои данные, например, с помощью схемы XSD, и проверьте их перед применением преобразования. Кроме того, вы можете сделать много проверки с помощью пользовательского кода XSLT.

...