У меня есть файл зарплаты 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="'
'"/>
<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
</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
</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
</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>
</xsl:text>
</xsl:if>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>