I'm trying to transform some XML data to csv, with the desired output being:
"0000001"|"2020-06-18"
"0000001"|"2020-06-17"
"0000001"|"2020-06-16"
"0000001"|"2020-06-15"
"0000001"|"2020-06-14"
"0000001"|"2020-07-02"
"0000001"|"2020-07-01"
"0000001"|"2020-06-30"
"0000001"|"2020-06-29"
"0000001"|"2020-06-28"
But instead I'm currently getting:
"0000001"|"2020-06-18"
"0000001"|"2020-06-17"
"0000001"|"2020-06-16"
"0000001"|"2020-06-15"
"0000001"|"2020-06-14"
"0000001"|"2020-06-18"
"0000001"|"2020-06-17"
"0000001"|"2020-06-16"
"0000001"|"2020-06-15"
"0000001"|"2020-06-14"
The XML I'm working with is in the following format:
<wd:Report_Data>
<wd:Report_Entry>
<wd:Worker>
<wd:Employee_ID>0000001</wd:Employee_ID>
</wd:Worker>
<wd:Time_Off_Event>
<wd:Time_Off_Date wd:Descriptor="18-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="17-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="16-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="15-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="14-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Worker>
<wd:Employee_ID>0000001</wd:Employee_ID>
</wd:Worker>
<wd:Time_Off_Event>
<wd:Time_Off_Date wd:Descriptor="02-Jul-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="01-Jul-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="30-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="29-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="28-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
</wd:Time_Off_Event>
</wd:Report_Entry>
</wd:Report_Data>
The snippet of XSLT concerning getting the date I've written so far:
<xsl:template match="wd:Report_Data/wd:Report_Entry">
<xsl:variable name="root" select="."/>
<xsl:for-each select="wd:Time_Off_Event/wd:Time_Off_Date">
<xsl:variable name="count" select="position()"/>
<Record xtt:separator="|" xtt:quotes="always" etv:incrementNumber="recordCount" xtt:quoteStyle="double">
<Employee_ID xtt:required="true" xtt:maxLength="7">
<xsl:value-of select="$root/wd:Worker/wd:Employee_ID"/>
</Employee_ID>
<Date xtt:required="true" xtt:maxLength="10">
<xsl:variable name="day" select="substring((//wd:Time_Off_Date/@wd:Descriptor)[$count],1,2)"/>
<xsl:variable name="month" select="substring((//wd:Time_Off_Date/@wd:Descriptor)[$count],4,3)"/>
<xsl:variable name="year" select="substring((//wd:Time_Off_Date/@wd:Descriptor)[$count],8,4)"/>
<xsl:variable name="monthConversion" select="string-length(substring-before('JanFebMarAprMayJunJulAugSepOctNovDec', $month)) div 3 + 1" />
<xsl:variable name="mthNum" select="format-number($monthConversion, '00')" />
<xsl:variable name="timeOffDate" select="concat($year,'-',$mthNum,'-',$day)"/>
<xsl:value-of select="$timeOffDate"/>
</Date>
</Record>
</xsl:for-each>
</xsl:template>
I'm quite the XSLT noob so apologies if you're wanting to bang your head against your desk at the sight of the above:)
My initial thought is that it's to do with my use of position() - I'm not 100% on how it works so any input would be appreciated.
Consider the following simplified example:
XML
<wd:Report_Data xmlns:wd="some/wd/namespace">
<wd:Report_Entry>
<wd:Worker>
<wd:Employee_ID>0000001</wd:Employee_ID>
</wd:Worker>
<wd:Time_Off_Event>
<wd:Time_Off_Date wd:Descriptor="18-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="17-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="16-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="15-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="14-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
</wd:Time_Off_Event>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:Worker>
<wd:Employee_ID>0000002</wd:Employee_ID>
</wd:Worker>
<wd:Time_Off_Event>
<wd:Time_Off_Date wd:Descriptor="02-Jul-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="01-Jul-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="30-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="29-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
<wd:Time_Off_Date wd:Descriptor="28-Jun-2020 - 1 Day">
</wd:Time_Off_Date>
</wd:Time_Off_Event>
</wd:Report_Entry>
</wd:Report_Data>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="some/wd/namespace"
exclude-result-prefixes="wd">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/wd:Report_Data">
<xsl:for-each select="wd:Report_Entry">
<xsl:variable name="empID" select="wd:Worker/wd:Employee_ID" />
<xsl:for-each select="wd:Time_Off_Event/wd:Time_Off_Date">
<xsl:text>"</xsl:text>
<xsl:value-of select="$empID"/>
<xsl:text>"|"</xsl:text>
<xsl:value-of select="substring(@wd:Descriptor, 8, 4)"/>
<xsl:text>-</xsl:text>
<xsl:variable name="mmm" select="substring(@wd:Descriptor, 4, 3)"/>
<xsl:variable name="m" select="string-length(substring-before('JanFebMarAprMayJunJulAugSepOctNovDec', $mmm)) div 3 + 1" />
<xsl:value-of select="format-number($m, '00')" />
<xsl:text>-</xsl:text>
<xsl:value-of select="substring(@wd:Descriptor, 1, 2)"/>
<xsl:text>" </xsl:text>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Result
"0000001"|"2020-06-18"
"0000001"|"2020-06-17"
"0000001"|"2020-06-16"
"0000001"|"2020-06-15"
"0000001"|"2020-06-14"
"0000002"|"2020-07-02"
"0000002"|"2020-07-01"
"0000002"|"2020-06-30"
"0000002"|"2020-06-29"
"0000002"|"2020-06-28"
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.