user2788441
user2788441

Reputation: 1

Eliminating carriage return for the last row in an XSLT

I'm new to XSLT and I'm trying to convert my clients xml data into fixed width file. There is a condition that all of the rows(except the last one) must end with a carriage return. I can't figure out how I can get rid of that carriage return after the last row. This is what I have so far: -->

    <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
        <xsl:value-of select="substring(concat('0',wd:XMLNAME_2,$padding),1,2)"/>

        <xsl:value-of select="substring(concat(wd:Company/wd:Employer_s_Federal_ID_Number,$padding),1,9)"/>

        <xsl:value-of select="substring(concat((wd:Company_-_Name),$padding),1,45)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:Address_-_Formatted_Line_1,$padding),1,40)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:Address_-_Formatted_Line_2,$padding),1,40)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:Address_-_Formatted_Line_3,$padding),1,40)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:city,$padding),1,25)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:State_ISO_Code,$padding),1,2)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:Postal_Code,$padding),1,5)"/>

        <xsl:value-of select="substring(concat(' ',$padding),1,4)"/>

        <xsl:value-of select="substring(concat(wd:CF_NewHire_Contact_First,$padding),1,16)"/>

        <xsl:value-of select="substring(concat(wd:CF_NewHire_Contact_Last,$padding),1,30)"/>

        <xsl:value-of select="substring(concat(CF_NewHire_Contact_Ext,CF_NewHIre_Contact_Phone,$padding),1,10)"/>

        <xsl:value-of select="substring(concat(wd:Social_Security_Number,$padding),1,9)"/>

        <xsl:value-of select="substring(concat(wd:Legal_Name_-_First_Name,$padding),1,16)"/>

        <xsl:value-of select="substring(concat(wd:Legal_Name_-_Middle_Name,$padding),1,6)"/>

        <xsl:value-of select="substring(concat(wd:Legal_Name_-_Last_Name,$padding),1,30)"/>

        <xsl:value-of select="substring(concat(wd:CF_Global_BirthDate_yyyymmdd,$padding),1,8)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:State_ISO_Code_2,$padding),1,2)"/>

        <xsl:value-of select="substring(concat(wd:CF_Global_Hire_yyyymmdd,$padding),1,8)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:Address_-_Formatted_Line_1,$padding),1,40)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:Address_-_Formatted_Line_2,$padding),1,40)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:Address_-_Formatted_Line_3,$padding),1,40)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:city,$padding),1,25)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:State_ISO_Code,$padding),1,2)"/>

        <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:Postal_Code,$padding),1,5)"/>

        <xsl:value-of select="substring(concat(' ',$padding),1,4)"/>

        <xsl:value-of select="substring(concat(' ',$padding),1,35)"/>

        <xsl:value-of select="substring(concat(' ',$padding),1,35)"/>
        <xsl:value-of select="$delimiter"></xsl:value-of>
    </xsl:for-each> 
</xsl:template>        

Upvotes: 0

Views: 831

Answers (2)

Martin Honnen
Martin Honnen

Reputation: 167706

Replace

<xsl:value-of select="$delimiter"></xsl:value-of>

with

<xsl:if test="position() != last()">
  <xsl:value-of select="$delimiter"></xsl:value-of>
</xsl:if>

Upvotes: 1

Mark Veenstra
Mark Veenstra

Reputation: 4739

You can this in XSLT 2.0 (if your using 2.0) with the last() command and a test as follows:

<xsl:if test="position() &lt; /wd:Report_Data/wd:Report_Entry[last()]">
    <xsl:value-of select="$delimiter"/>
</xsl:if>

Here a complete sample of my XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="uri">
    <xsl:output method="text" />

    <xsl:variable name="padding">
        <xsl:text>_</xsl:text>
    </xsl:variable>

    <xsl:variable name="delimiter">
        <xsl:text>|</xsl:text>
    </xsl:variable>

    <xsl:template match="/wd:root">
        <xsl:for-each select="wd:Report_Data/wd:Report_Entry">
            <xsl:value-of select="substring(concat('0',wd:XMLNAME_2,$padding),1,2)"/>
            <xsl:value-of select="substring(concat(wd:Company/wd:Employer_s_Federal_ID_Number,$padding),1,9)"/>
            <xsl:value-of select="substring(concat((wd:Company_-_Name),$padding),1,45)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:Address_-_Formatted_Line_1,$padding),1,40)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:Address_-_Formatted_Line_2,$padding),1,40)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:Address_-_Formatted_Line_3,$padding),1,40)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:city,$padding),1,25)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:State_ISO_Code,$padding),1,2)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:Postal_Code,$padding),1,5)"/>
            <xsl:value-of select="substring(concat(' ',$padding),1,4)"/>
            <xsl:value-of select="substring(concat(wd:CF_NewHire_Contact_First,$padding),1,16)"/>
            <xsl:value-of select="substring(concat(wd:CF_NewHire_Contact_Last,$padding),1,30)"/>
            <xsl:value-of select="substring(concat(CF_NewHire_Contact_Ext,CF_NewHIre_Contact_Phone,$padding),1,10)"/>
            <xsl:value-of select="substring(concat(wd:Social_Security_Number,$padding),1,9)"/>
            <xsl:value-of select="substring(concat(wd:Legal_Name_-_First_Name,$padding),1,16)"/>
            <xsl:value-of select="substring(concat(wd:Legal_Name_-_Middle_Name,$padding),1,6)"/>
            <xsl:value-of select="substring(concat(wd:Legal_Name_-_Last_Name,$padding),1,30)"/>
            <xsl:value-of select="substring(concat(wd:CF_Global_BirthDate_yyyymmdd,$padding),1,8)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Work_Address/wd:State_ISO_Code_2,$padding),1,2)"/>
            <xsl:value-of select="substring(concat(wd:CF_Global_Hire_yyyymmdd,$padding),1,8)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:Address_-_Formatted_Line_1,$padding),1,40)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:Address_-_Formatted_Line_2,$padding),1,40)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:Address_-_Formatted_Line_3,$padding),1,40)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:city,$padding),1,25)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:State_ISO_Code,$padding),1,2)"/>
            <xsl:value-of select="substring(concat(wd:Primary_Home_Address/wd:Postal_Code,$padding),1,5)"/>
            <xsl:value-of select="substring(concat(' ',$padding),1,4)"/>
            <xsl:value-of select="substring(concat(' ',$padding),1,35)"/>
            <xsl:value-of select="substring(concat(' ',$padding),1,35)"/>
            <xsl:if test="position() &lt; /wd:root/wd:Report_Data/wd:Report_Entry[last()]">
                <xsl:value-of select="$delimiter"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

When applied on this XML:

<?xml version="1.0" encoding="UTF-8"?>
<wd:root xmlns:wd="uri">
    <wd:Report_Data>
        <wd:Report_Entry>
            <wd:Legal_Name_-_First_Name>Mark</wd:Legal_Name_-_First_Name>
            <wd:Legal_Name_-_Last_Name>Veenstra</wd:Legal_Name_-_Last_Name>
        </wd:Report_Entry>
        <wd:Report_Entry>
            <wd:Legal_Name_-_First_Name>Veenstra</wd:Legal_Name_-_First_Name>
            <wd:Legal_Name_-_Last_Name>Mark</wd:Legal_Name_-_Last_Name>
        </wd:Report_Entry>
        <wd:Report_Entry>
            <wd:Legal_Name_-_First_Name>M</wd:Legal_Name_-_First_Name>
            <wd:Legal_Name_-_Last_Name>Veenstra</wd:Legal_Name_-_Last_Name>
        </wd:Report_Entry>
        <wd:Report_Entry>
            <wd:Legal_Name_-_First_Name>Veenstra</wd:Legal_Name_-_First_Name>
            <wd:Legal_Name_-_Last_Name>M</wd:Legal_Name_-_Last_Name>
        </wd:Report_Entry>
    </wd:Report_Data>
</wd:root>

It produces a ASCII without the last delimiter.

Upvotes: 0

Related Questions