未显示使用XSLT节点值的XML到CSV
我是一个新手,正在编写从XML到CSV的XSLT转换。以下是输出文件的外观(预期结果): 但我得到了这个,不知道如何得到计数和总数,也不包括完全为401(k)T的行未显示使用XSLT节点值的XML到CSV,xml,csv,xslt,Xml,Csv,Xslt,我是一个新手,正在编写从XML到CSV的XSLT转换。以下是输出文件的外观(预期结果): 但我得到了这个,不知道如何得到计数和总数,也不包括完全为401(k)T的行 21072,Charles,Bradley,401(k) [USA],377.96, 401(k) Roth [USA],94.49, 401(k) T,94.49, 21082,Alex,Grossman,401(k) [USA],10657.15, 401(k) T,10657.15, 我尝试了以下XSLT <xsl:s
21072,Charles,Bradley,401(k) [USA],377.96,
401(k) Roth [USA],94.49,
401(k) T,94.49,
21082,Alex,Grossman,401(k) [USA],10657.15,
401(k) T,10657.15,
我尝试了以下XSLT
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:wd="urn:com.workday.report/CR-TestReport"
exclude-result-prefixes="xs wd"
version="2.0">
<xsl:output method="text"/>
<xsl:param name="separator" select="','"/>
<xsl:param name="linefeed" select="' '"/>
<xsl:template match="/">
<xsl:call-template name="DetailRecords"/>
<xsl:call-template name="TrailerRecord"/>
</xsl:template>
<!--Builds Detail Records -->
<xsl:template name="DetailRecords">
<xsl:for-each select = "wd:Report_Data/wd:Report_Entry">
<xsl:value-of select="wd:Employee_ID"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="wd:First_Name"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="wd:Last_Name"/>
<xsl:value-of select="$separator"/>
<xsl:for-each select = "wd:Payroll_Result_Lines">
<xsl:value-of select="wd:Deduction/@wd:Descriptor"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select = "wd:Result_Line_Amount"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="$linefeed"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<!--Builds Trailer Record -->
<xsl:template name="TrailerRecord">
</xsl:template>
</xsl:stylesheet>
对于此XML文件
<?xml version='1.0' encoding='UTF-8'?>
<wd:Report_Data xmlns:wd="urn:com.workday.report/CR-TestReport">
<wd:Report_Entry>
<wd:Employee_ID>21072</wd:Employee_ID>
<wd:Last_Name>Bradley</wd:Last_Name>
<wd:First_Name>Charles</wd:First_Name>
<wd:Payroll_Result_Lines>
<wd:Deduction wd:Descriptor="401(k) [USA]">
<wd:ID wd:type="WID">ff68c0f1227c41a2a5221f6a7e6a67e5</wd:ID>
<wd:ID wd:type="Deduction_Code">401K</wd:ID>
</wd:Deduction>
<wd:Result_Line_Amount>377.96</wd:Result_Line_Amount>
</wd:Payroll_Result_Lines>
<wd:Payroll_Result_Lines>
<wd:Deduction wd:Descriptor="401(k) Roth [USA]">
<wd:ID wd:type="WID">2d277641684a48fb861a896e4eeb3eea</wd:ID>
<wd:ID wd:type="Deduction_Code">401K-R</wd:ID>
</wd:Deduction>
<wd:Result_Line_Amount>94.49</wd:Result_Line_Amount>
</wd:Payroll_Result_Lines>
<wd:Payroll_Result_Lines>
<wd:Deduction wd:Descriptor="401(k) T">
<wd:ID wd:type="WID">2d277641684a48fb861a896e4eeb3eea</wd:ID>
<wd:ID wd:type="Deduction_Code">401K-T</wd:ID>
</wd:Deduction>
<wd:Result_Line_Amount>94.49</wd:Result_Line_Amount>
</wd:Payroll_Result_Lines>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Employee_ID>21082</wd:Employee_ID>
<wd:Last_Name>Grossman</wd:Last_Name>
<wd:First_Name>Alex</wd:First_Name>
<wd:Payroll_Result_Lines>
<wd:Deduction wd:Descriptor="401(k) [USA]">
<wd:ID wd:type="WID">ff68c0f1227c41a2a5221f6a7e6a67e5</wd:ID>
<wd:ID wd:type="Deduction_Code">401K</wd:ID>
</wd:Deduction>
<wd:Result_Line_Amount>10657.15</wd:Result_Line_Amount>
</wd:Payroll_Result_Lines>
<wd:Payroll_Result_Lines>
<wd:Deduction wd:Descriptor="401(k) T">
<wd:ID wd:type="WID">ff68c0f1227c41a2a5221f6a7e6a67e5</wd:ID>
<wd:ID wd:type="Deduction_Code">401K-T</wd:ID>
</wd:Deduction>
<wd:Result_Line_Amount>10657.15</wd:Result_Line_Amount>
</wd:Payroll_Result_Lines>
</wd:Report_Entry>
</wd:Report_Data>
21072
布拉德利
查尔斯
ff68c0f1227c41a2a5221f6a7e6a67e5
401K
377.96
2d277641684a48fb861a896e4eeb3eea
401K-R
94.49
2d277641684a48fb861a896e4eeb3eea
401K-T
94.49
21082
格罗斯曼
亚历克斯
ff68c0f1227c41a2a5221f6a7e6a67e5
401K
10657.15
ff68c0f1227c41a2a5221f6a7e6a67e5
401K-T
10657.15
要获得所需的结果,您可以将模板更改为以下内容
<!--Builds Detail Records -->
<xsl:template name="DetailRecords">
<xsl:for-each select = "wd:Report_Data/wd:Report_Entry">
<xsl:for-each select = "wd:Payroll_Result_Lines[wd:Deduction/wd:ID[@wd:type='Deduction_Code'] != '401K-T']">
<xsl:value-of select="../wd:Employee_ID"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="../wd:First_Name"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="../wd:Last_Name"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="wd:Deduction/wd:ID[@wd:type='Deduction_Code']"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select = "wd:Result_Line_Amount"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="$linefeed"/>
</xsl:for-each>
</xsl:for-each>
<xsl:value-of select="count(wd:Report_Data/wd:Report_Entry/wd:Payroll_Result_Lines[wd:Deduction/wd:ID[@wd:type='Deduction_Code'] != '401K-T'])"/>
<xsl:value-of select="$separator"/>
<xsl:value-of select="sum(wd:Report_Data/wd:Report_Entry/wd:Payroll_Result_Lines[wd:Deduction/wd:ID[@wd:type='Deduction_Code'] != '401K-T']/wd:Result_Line_Amount)"/>
</xsl:template>
我无法发表评论,但我得到了与@zx485相同的答案,只是我删除了终止分隔符。上面所需的结果不是每行都有尾随逗号:
<xsl:value-of select = "wd:Result_Line_Amount"/>
<xsl:value-of select="$linefeed"/>
</xsl:for-each>
我希望这会有所帮助,并希望与大家分享——我对SO是新手,所以不确定提供最佳方式,因为zx的答案非常接近。当您使用XSLT 2创建CSV时,我建议您利用
xsl:value of separator
在CSV中“构造”一行或记录
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="urn:com.workday.report/CR-TestReport"
xmlns:wd="urn:com.workday.report/CR-TestReport"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output method="text"/>
<xsl:param name="separator" select="','"/>
<xsl:param name="linefeed" select="' '"/>
<xsl:template match="/">
<xsl:variable name="rows" select="//Report_Entry/Payroll_Result_Lines[Deduction[not(ID[@wd:type = 'Deduction_Code'] = '401K-T')]]"/>
<xsl:apply-templates select="$rows"/>
<xsl:value-of select="count($rows), sum($rows/Result_Line_Amount)" separator="{$separator}"/>
</xsl:template>
<xsl:template match="Payroll_Result_Lines">
<xsl:value-of select="../(Employee_ID, First_Name, Last_Name), Deduction/@wd:Descriptor, Result_Line_Amount" separator="{$separator}"/>
<xsl:value-of select="$linefeed"/>
</xsl:template>
</xsl:stylesheet>
您能用文字解释一下所需的逻辑吗?例如,我希望每个uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。1.详细记录应包含以下字段(按此顺序):员工ID姓名扣除代码结果行金额拖车记录应包含此数据(按此顺序):文件上的记录总数文件上的总额2.删除扣除代码为“401K-T”的工资单结果。更新代码以排除这些记录。谢谢,SriniThank你这么多zx485,它现在正在工作,我已经从我的XSLT中删除了拖车记录模板,基于你的代码很高兴我能帮上忙。
<xsl:value-of select = "wd:Result_Line_Amount"/>
<xsl:value-of select="$linefeed"/>
</xsl:for-each>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="urn:com.workday.report/CR-TestReport"
xmlns:wd="urn:com.workday.report/CR-TestReport"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output method="text"/>
<xsl:param name="separator" select="','"/>
<xsl:param name="linefeed" select="' '"/>
<xsl:template match="/">
<xsl:variable name="rows" select="//Report_Entry/Payroll_Result_Lines[Deduction[not(ID[@wd:type = 'Deduction_Code'] = '401K-T')]]"/>
<xsl:apply-templates select="$rows"/>
<xsl:value-of select="count($rows), sum($rows/Result_Line_Amount)" separator="{$separator}"/>
</xsl:template>
<xsl:template match="Payroll_Result_Lines">
<xsl:value-of select="../(Employee_ID, First_Name, Last_Name), Deduction/@wd:Descriptor, Result_Line_Amount" separator="{$separator}"/>
<xsl:value-of select="$linefeed"/>
</xsl:template>
</xsl:stylesheet>