Reputation: 1
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
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
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() < /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() < /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