我需要帮助将XML从行转换为XML输出中的元素。
我在下面列出了源和预期的XML。可能有<Pay_Result_Lines_group>
的多个实例,其中大多数<Tax_Order>
的值为99。输出XML是根据<Tax_Order>
排序的,即1-4或99。对于顺序为99的实例,它们将被放在<Tax_5_Desc>
,<Tax_6_desc>
,<Tax_7_Desc>
,... <Tax_n_Desc>
下,直到在源XML中有多少个为止。
源XML如下:
<Report_Entry>
<Account_ID>123456</Account_ID>
<Pay_Result_Lines_group>
<Tax_N_Description>W_FWFEDERAL</Tax_N_Description>
<Tax_N_Rate>0</Tax_N_Rate>
<Tax_Order>1</Tax_Order>
</Pay_Result_Lines_group>
<Pay_Result_Lines_group>
<Tax_N_Description>W_MEDFEDERAL</Tax_N_Description>
<Tax_N_Rate>0.0145</Tax_N_Rate>
<Tax_Order>2</Tax_Order>
</Pay_Result_Lines_group>
<Pay_Result_Lines_group>
<Tax_N_Description>W_OASFEDERAL</Tax_N_Description>
<Tax_N_Rate>0.062</Tax_N_Rate>
<Tax_Order>4</Tax_Order>
</Pay_Result_Lines_group>
<Pay_Result_Lines_group>
<Tax_N_Description>W_SUI34</Tax_N_Description>
<Tax_N_Rate>0.003825</Tax_N_Rate>
<Tax_Order>99</Tax_Order>
</Pay_Result_Lines_group>
<Pay_Result_Lines_group>
<Tax_N_Description>W_NJFAMNJFLI</Tax_N_Description>
<Tax_N_Rate>0.0008</Tax_N_Rate>
<Tax_Order>99</Tax_Order>
</Pay_Result_Lines_group>
<Pay_Result_Lines_group>
<Tax_N_Description>W_NJWDNJ-WDF</Tax_N_Description>
<Tax_N_Rate>0.000425</Tax_N_Rate>
<Tax_Order>99</Tax_Order>
</Pay_Result_Lines_group>
</Report_Entry>
预期输出如下:
<Workers>
<Worker>
<Account_ID>123456</Account_ID>
<Tax_1_Desc>W_FWFEDERAL</Tax_1_Desc>
<Tax_1_Rate/>
<Tax_2_Desc>W_MEDFEDERAL</Tax_2_Desc>
<Tax_2_Rate/>
<Tax_4_Desc>W_OASFEDERAL</Tax_4_Desc>
<Tax_4_Rate/>
<Tax_5_Desc>W_SUI34</Tax_5_Desc>
<Tax_5_Rate/>
<Tax_6_Desc>W_NJFAMNJFLI</Tax_6_Desc>
<Tax_6_Rate/>
<Tax_7_Desc>W_NJWDNJ-WDF</Tax_7_Desc>
<Tax_7_Rate/>
</Worker>
</Workers>
答案 0 :(得分:1)
您可以使用此XSLT-1.0样式表:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/Report_Entry">
<Workers>
<Worker>
<xsl:copy-of select="Account_ID" />
<xsl:apply-templates select="Pay_Result_Lines_group" />
</Worker>
</Workers>
</xsl:template>
<xsl:template match="Pay_Result_Lines_group">
<xsl:variable name="nbr">
<xsl:choose>
<xsl:when test="5 > Tax_Order">
<xsl:value-of select="Tax_Order" />
</xsl:when>
<xsl:when test="Tax_Order = 99">
<xsl:value-of select="preceding-sibling::Pay_Result_Lines_group[Tax_Order != 99][1]/Tax_Order + position() - count(preceding-sibling::Pay_Result_Lines_group[Tax_Order != 99])" />
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:element name="{concat('Tax_',$nbr,'_Desc')}">
<xsl:value-of select="Tax_N_Description" />
</xsl:element>
<xsl:element name="{concat('Tax_',$nbr,'_Rate')}">
<!-- <xsl:value-of select="Tax_N_Rate" /> -->
</xsl:element>
</xsl:template>
</xsl:stylesheet>
其输出为:
<Workers>
<Worker>
<Account_ID>123456</Account_ID>
<Tax_1_Desc>W_FWFEDERAL</Tax_1_Desc>
<Tax_1_Rate/>
<Tax_2_Desc>W_MEDFEDERAL</Tax_2_Desc>
<Tax_2_Rate/>
<Tax_4_Desc>W_OASFEDERAL</Tax_4_Desc>
<Tax_4_Rate/>
<Tax_5_Desc>W_SUI34</Tax_5_Desc>
<Tax_5_Rate/>
<Tax_6_Desc>W_NJFAMNJFLI</Tax_6_Desc>
<Tax_6_Rate/>
<Tax_7_Desc>W_NJWDNJ-WDF</Tax_7_Desc>
<Tax_7_Rate/>
</Worker>
</Workers>