xml - 需要帮助将值从一个对等 XML 组放到另一个 XML 组
问题描述
我有以下输入 XML 结构和目标输出。每个 Payroll_Result_Lines_group 将有一个输出记录“工人”。我的问题是关于 Column5,它应该是“Payroll_Result_group”下的 YTD 工资。它应该基于 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>
解决方案
您需要将deduction_code
andytd_wage
变量的声明放在xsl:for-each
of 中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>
推荐阅读
- flutter - 更改全屏关闭按钮的颜色
- angular - 访问“http://....”源“http://localhost:4200”的 XMLHttpRequest 已被 CORS 策略阻止
- java - 我在一个奇怪的地方遇到了一个代码错误,当我尝试修复它时,我得到了很多错误。我该如何解决?
- c - c程序查找数据类型中的位数的问题
- iptables - 当我的路由器上没有 nat 表时,如何将所有 ipv6 dns 请求重定向到本地 dnsmasq?
- java - 无法初始化类 android.databinding.parser.XMLLexer
- java - 使用 Java8 的 Spark 2.3 将行转换为列
- spring-boot - 将日期时间添加到日志文件名
- javascript - 如何编辑网站 HTML,然后在您重新加载时让它在那里,但只为您服务?
- scala - Spark/Scala:如何获得前 X % 的行?