Нужна помощь для переноса значений из одной равноправной группы XML в другую группу XML - PullRequest
0 голосов
/ 07 июня 2019

У меня есть ниже структура ввода XML и целевой вывод. Каждая группа Payroll_Result_Lines_group будет иметь одну выходную запись «Рабочий». У меня есть вопрос к Колонке 5, которая должна быть Заработной платой с начала года под "Payroll_Result_group". Он должен основываться на значении wd: Payroll_Result_Lines_group / wd: Deduction / @ Deduction_Code.

Ниже XSL, который у меня есть. Я понял, что переменные deduction_code и ytd_wage оцениваются только один раз для каждого работника, поскольку я размещаю их на уровне Report_Entry. Это привело к Если я помещу эти переменные в wd: Payroll_Result_Lines_group, то ytd_wage ничего не возвращает, так как группа "Payroll_Result_group" не находится под "Payroll_Result_Lines_group". Любой совет?

Входной XML:

<wd:Report_Entry>
    <wd:Account_ID>123456</wd:Account_ID>
    <wd:Payroll_Result_Lines_group>
        <wd:Tax_Description>W_FWFEDERAL</wd:Tax_Description>
        <wd:Deduction wd:Descriptor="Federal Withholding [USA]">
            <wd:ID wd:type="Deduction_Code">W_FW</wd:ID>
        </wd:Deduction>
        <wd:YTD_Withheld>1111</wd:YTD_Withheld>
    </wd:Payroll_Result_Lines_group>
    <wd:Payroll_Result_Lines_group>
        <wd:Tax_Description>W_MEDFEDERAL</wd:Tax_Description>
        <wd:Deduction wd:Descriptor="Medicare [USA]">
            <wd:ID wd:type="Deduction_Code">W_MED</wd:ID>
        </wd:Deduction>
        <wd:YTD_Withheld>1112</wd:YTD_Withheld>
    </wd:Payroll_Result_Lines_group>
    <wd:Payroll_Result_Lines_group>
        <wd:Tax_Description>W_OASFEDERAL</wd:Tax_Description>
        <wd:Deduction wd:Descriptor="OASDI [USA]">
            <wd:ID wd:type="Deduction_Code">W_OAS</wd:ID>
        </wd:Deduction>
        <wd:YTD_Withheld>1113</wd:YTD_Withheld>
    </wd:Payroll_Result_Lines_group>
    <wd:Payroll_Result_group>
        <wd:YTD_Supplemental_Wage>66</wd:YTD_Supplemental_Wage>
        <wd:YTD_Federal_Wage>1000</wd:YTD_Federal_Wage>
        <wd:YTD_Medicare_Wage>2000</wd:YTD_Medicare_Wage>
        <wd:YTD_OASDI_Wage>3000</wd:YTD_OASDI_Wage>
        <wd:YTD_State_Wage>4000</wd:YTD_State_Wage>
    </wd:Payroll_Result_group>
</wd:Report_Entry>

Выход:

<Workers>
    <Worker>
        <Column1 maxlen="11">808452</Column1>
        <Column2 maxlen="15">W_FWFEDERAL</Column2>
        <Column3 maxlen="13">1111</Column3>
        <Column4 maxlen="13">66</Column4>
        <Column5 maxlen="13"/>1000</ Column5>
    </Worker>
    <Worker>
        <Column1 maxlen="11">808452</Column1>
        <Column2 maxlen="15">W_MEDFEDERAL</Column2>
        <Column3 maxlen="13">1112</Column3>
        <Column4 maxlen="13">66</Column4>
        <Column5 maxlen="13"/>2000</ Column5>
    </Worker>
    <Worker>
        <Column1 maxlen="11">808452</Column1>
        <Column2 maxlen="15">W_OASFEDERAL</Column2>
        <Column3 maxlen="13">1113</Column3>
        <Column4 maxlen="13">66</Column4>
        <Column5 maxlen="13"/>3000</ Column5>
    </Worker>
</Workers>

XSL:

<xsl:template match="/wd:Report_Data">
        <xsl:for-each select="wd:Report_Entry">
            <xsl:variable name="account_id" select="wd:Account_ID"/>
            <xsl:variable name="ytd_supp_wage" select="wd:Payroll_Result_group/wd:YTD_Supplemental_Wage"/>
            <xsl:variable name="deduction_code" select="wd:Payroll_Result_Lines_group/wd:Deduction/wd:ID[2]"/> 
            <xsl:variable name="ytd_wage">
                <xsl:choose>
                    <xsl:when test="$deduction_code='W_FW'"><xsl:value-of select="wd:Payroll_Result_group/wd:YTD_Federal_Wage"/></xsl:when>
                    <xsl:when test="$deduction_code = 'W_MED'"><xsl:value-of select="wd:Payroll_Result_group/wd:YTD_Medicare_Wage"/></xsl:when>
                    <xsl:when test="$deduction_code = 'W_OAS'"><xsl:value-of select="wd:Payroll_Result_group/wd:YTD_OASDI_Wage"/></xsl:when>
                    <xsl:when test="$deduction_code = 'W_SWW'"><xsl:value-of select="wd:Payroll_Result_group/wd:YTD_State_Wage"/></xsl:when>
                </xsl:choose>                   
            </xsl:variable>
            <xsl:for-each select="wd:Payroll_Result_Lines_group">
                <Worker >
                    <Column1 xtt:maxLength="11"><xsl:value-of select="$account_id"/></Column1>
                    <Column2 xtt:maxLength="15"><xsl:value-of select="wd:Tax_Description"/></Column2>   
                    <Column3 xtt:maxLength="13"><xsl:value-of select="wd:YTD_Withheld"/></Column3>
                    <Column4 xtt:maxLength="13"><xsl:value-of select="$ytd_supp_wage"/></Column4>
                    <Column5 xtt:maxLength="13"><xsl:value-of select="$ytd_wage"/></Column5>                        
                </Worker>
            </xsl:for-each> 
        </xsl:for-each>
    </Workers>      
</xsl:template>

1 Ответ

2 голосов
/ 07 июня 2019

Вам необходимо поместить объявление переменных deduction_code и ytd_wage в xsl:for-each из wd:Payroll_Result_Lines_group, поскольку они действительно зависят от работника, которого вы обрабатываете.

Попытка этого XSLT

<xsl:template match="/wd:Report_Data">
    <Workers>
        <xsl:for-each select="wd:Report_Entry">
            <xsl:variable name="account_id" select="wd:Account_ID"/>
            <xsl:variable name="ytd_supp_wage" select="wd:Payroll_Result_group/wd:YTD_Supplemental_Wage"/>
            <xsl:for-each select="wd:Payroll_Result_Lines_group">
                <xsl:variable name="deduction_code" select="wd:Deduction/wd:ID"/> 
                <xsl:variable name="ytd_wage">
                    <xsl:choose>
                        <xsl:when test="$deduction_code = 'W_FW'"><xsl:value-of select="../wd:Payroll_Result_group/wd:YTD_Federal_Wage"/></xsl:when>
                        <xsl:when test="$deduction_code = 'W_MED'"><xsl:value-of select="../wd:Payroll_Result_group/wd:YTD_Medicare_Wage"/></xsl:when>
                        <xsl:when test="$deduction_code = 'W_OAS'"><xsl:value-of select="../wd:Payroll_Result_group/wd:YTD_OASDI_Wage"/></xsl:when>
                        <xsl:when test="$deduction_code = 'W_SWW'"><xsl:value-of select="../wd:Payroll_Result_group/wd:YTD_State_Wage"/></xsl:when>
                    </xsl:choose>                   
                </xsl:variable>
                <Worker>
                    <Column1 xtt:maxLength="11"><xsl:value-of select="$account_id"/></Column1>
                    <Column2 xtt:maxLength="15"><xsl:value-of select="wd:Tax_Description"/></Column2>   
                    <Column3 xtt:maxLength="13"><xsl:value-of select="wd:YTD_Withheld"/></Column3>
                    <Column4 xtt:maxLength="13"><xsl:value-of select="$ytd_supp_wage"/></Column4>
                    <Column5 xtt:maxLength="13"><xsl:value-of select="$ytd_wage"/></Column5>                        
                </Worker>
            </xsl:for-each> 
        </xsl:for-each>
    </Workers>      
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...