XML в CSV с использованием значений узлов XSLT, которые не отображаются - PullRequest
0 голосов
/ 03 мая 2019

Я новичок и пишу XSLT-преобразование из XML в CSV.Ниже приведен выходной файл, который должен выглядеть следующим образом (желаемый результат):

21072,Charles,Bradley,401K,377.96
21072,Charles,Bradley,401K-R,94.49
21082,Alex,Grossman,401K,10657.15
3,11129.6

, но я получаю это и не уверен, как получить количество и общее количество, а также исключить строки, которые являются 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: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="'&#13;&#10;'"/>


    <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>

Ответы [ 3 ]

1 голос
/ 03 мая 2019

Поскольку вы используете 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="'&#13;&#10;'"/>

  <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>

https://xsltfiddle.liberty -development.net / jyRYYiE

0 голосов
/ 03 мая 2019

Я не могу комментировать, но получил тот же ответ, что и @ zx485, за исключением того, что я удалил завершающий разделитель. В приведенном выше желаемом результате нет запятой для каждой строки:

            <xsl:value-of select = "wd:Result_Line_Amount"/>
            <xsl:value-of select="$linefeed"/>
        </xsl:for-each>

Я надеюсь, что это поможет и хотел бы поделиться - я новичок в SO, поэтому не уверен в лучшем способе предоставить, так как ответ zx был очень близок.

0 голосов
/ 03 мая 2019

Чтобы получить желаемый результат, вы можете изменить свой шаблон на следующий.

<!--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>

Его результат:

21072,Charles,Bradley,401K,377.96,
21072,Charles,Bradley,401K-R,94.49,
21082,Alex,Grossman,401K,10657.15,
3,11129.6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...