Why fixed width?
Let's learn XSLT through examples. This is the continuation to the previous article Workday XSLT 07- Basic XSLT Examples (For-Each-Group).
YouTube Video
Online XSLT Editor
freeformatter.com/xsl-transformer.html
XSLT - Fixed width - Example 1
XML
<?xml version="1.0" encoding="UTF-8"?> <Root xmlns:ab="http://www.w3.org/TR/html4/"> <ab:Row> <ab:Employee_ID>1001</ab:Employee_ID> <ab:Name Type="Full Name">Emma Dylan</ab:Name> <ab:Hire_Date>2019-01-13</ab:Hire_Date> <ab:Company>GMS USA</ab:Company> <ab:Location>Office</ab:Location> <ab:Annual_Salary>110011.13</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1002</ab:Employee_ID> <ab:Name Type="Full Name">James Tyler</ab:Name> <ab:Hire_Date>2020-12-20</ab:Hire_Date> <ab:Company>GMS USA</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>91232</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1003</ab:Employee_ID> <ab:Name Type="Full Name">Oliver Parton</ab:Name> <ab:Hire_Date>2020-02-14</ab:Hire_Date> <ab:Company>GMS Germany</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>110011.12</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1004</ab:Employee_ID> <ab:Name Type="Full Name">Oliver Parton</ab:Name> <ab:Hire_Date>2020-02-14</ab:Hire_Date> <ab:Company>GMS Germany</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>110000</ab:Annual_Salary> </ab:Row> </Root>
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ab="http://www.w3.org/TR/html4/" version="2.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:text>EmplID Name Company </xsl:text> <xsl:text>
</xsl:text> <xsl:for-each select="Root/ab:Row"> <xsl:value-of select="substring(concat(ab:Employee_ID,' '),1,12)"/> <xsl:value-of select="substring(concat(ab:Name,' '),1,25)"/> <xsl:value-of select="substring(concat(ab:Company,' '),1,15)"/> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Output
EmplID Name Company 1001 Emma Dylan GMS USA 1002 James Tyler GMS USA 1003 Oliver Parton GMS Germany 1004 Oliver Parton GMS Germany
XSLT - Fixed width - Example 2 (with Variable)
XML
<?xml version="1.0" encoding="UTF-8"?> <Root xmlns:ab="http://www.w3.org/TR/html4/"> <ab:Row> <ab:Employee_ID>1001</ab:Employee_ID> <ab:Name Type="Full Name">Emma Dylan</ab:Name> <ab:Hire_Date>2019-01-13</ab:Hire_Date> <ab:Company>GMS USA</ab:Company> <ab:Location>Office</ab:Location> <ab:Annual_Salary>110011.13</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1002</ab:Employee_ID> <ab:Name Type="Full Name">James Tyler</ab:Name> <ab:Hire_Date>2020-12-20</ab:Hire_Date> <ab:Company>GMS USA</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>91232</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1003</ab:Employee_ID> <ab:Name Type="Full Name">Oliver Parton</ab:Name> <ab:Hire_Date>2020-02-14</ab:Hire_Date> <ab:Company>GMS Germany</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>110011.12</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1004</ab:Employee_ID> <ab:Name Type="Full Name">Oliver Parton</ab:Name> <ab:Hire_Date>2020-02-14</ab:Hire_Date> <ab:Company>GMS Germany</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>110000</ab:Annual_Salary> </ab:Row> </Root>
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ab="http://www.w3.org/TR/html4/" version="2.0"> <xsl:output method="text"/> <xsl:variable name="some_spaces" select="' '" /> <xsl:template match="/"> <xsl:text>EmplID Name Company </xsl:text> <xsl:text>
</xsl:text> <xsl:for-each select="Root/ab:Row"> <xsl:value-of select="substring(concat(ab:Employee_ID,$some_spaces),1,12)"/> <xsl:value-of select="substring(concat(ab:Name,$some_spaces),1,25)"/> <xsl:value-of select="substring(concat(ab:Company,$some_spaces),1,15)"/> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet>
Output
EmplID Name Company 1001 Emma Dylan GMS USA 1002 James Tyler GMS USA 1003 Oliver Parton GMS Germany 1004 Oliver Parton GMS Germany
XSLT - Fixed width - Example 3 (with Apply-Templates)
XML
<?xml version="1.0" encoding="UTF-8"?> <Root xmlns:ab="http://www.w3.org/TR/html4/"> <ab:Row> <ab:Employee_ID>1001</ab:Employee_ID> <ab:Name Type="Full Name">Emma Dylan</ab:Name> <ab:Hire_Date>2019-01-13</ab:Hire_Date> <ab:Company>GMS USA</ab:Company> <ab:Location>Office</ab:Location> <ab:Annual_Salary>110011.13</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1002</ab:Employee_ID> <ab:Name Type="Full Name">James Tyler</ab:Name> <ab:Hire_Date>2020-12-20</ab:Hire_Date> <ab:Company>GMS USA</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>91232</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1003</ab:Employee_ID> <ab:Name Type="Full Name">Oliver Parton</ab:Name> <ab:Hire_Date>2020-02-14</ab:Hire_Date> <ab:Company>GMS Germany</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>110011.12</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1004</ab:Employee_ID> <ab:Name Type="Full Name">Oliver Parton</ab:Name> <ab:Hire_Date>2020-02-14</ab:Hire_Date> <ab:Company>GMS Germany</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>110000</ab:Annual_Salary> </ab:Row> </Root>
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ab="http://www.w3.org/TR/html4/" version="2.0"> <xsl:output method="text"/> <xsl:variable name="some_spaces" select="' '" /> <xsl:template match="/"> <xsl:text>EmplID Name Company </xsl:text> <xsl:text>
</xsl:text> <xsl:for-each select="Root/ab:Row"> <xsl:apply-templates mode="format" select="ab:Employee_ID"> <xsl:with-param name="width" select="12"/> </xsl:apply-templates> <xsl:apply-templates mode="format" select="ab:Name"> <xsl:with-param name="width" select="25"/> </xsl:apply-templates> <xsl:apply-templates mode="format" select="ab:Company"> <xsl:with-param name="width" select="15"/> </xsl:apply-templates> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> <xsl:template match="node()" mode ="format"> <xsl:param name="width" /> <xsl:value-of select="substring(concat(text(),$some_spaces), 1, $width)"/> </xsl:template> </xsl:stylesheet>
Output
EmplID Name Company 1001 Emma Dylan GMS USA 1002 James Tyler GMS USA 1003 Oliver Parton GMS Germany 1004 Oliver Parton GMS Germany
XSLT - Fixed width - Example 4 (with Call-Templates)
XML
<?xml version="1.0" encoding="UTF-8"?> <Root xmlns:ab="http://www.w3.org/TR/html4/"> <ab:Row> <ab:Employee_ID>1001</ab:Employee_ID> <ab:Name Type="Full Name">Emma Dylan</ab:Name> <ab:Hire_Date>2019-01-13</ab:Hire_Date> <ab:Company>GMS USA</ab:Company> <ab:Location>Office</ab:Location> <ab:Annual_Salary>110011.13</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1002</ab:Employee_ID> <ab:Name Type="Full Name">James Tyler</ab:Name> <ab:Hire_Date>2020-12-20</ab:Hire_Date> <ab:Company>GMS USA</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>91232</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1003</ab:Employee_ID> <ab:Name Type="Full Name">Oliver Parton</ab:Name> <ab:Hire_Date>2020-02-14</ab:Hire_Date> <ab:Company>GMS Germany</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>110011.12</ab:Annual_Salary> </ab:Row> <ab:Row> <ab:Employee_ID>1004</ab:Employee_ID> <ab:Name Type="Full Name">Oliver Parton</ab:Name> <ab:Hire_Date>2020-02-14</ab:Hire_Date> <ab:Company>GMS Germany</ab:Company> <ab:Location>Store</ab:Location> <ab:Annual_Salary>110000</ab:Annual_Salary> </ab:Row> </Root>
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ab="http://www.w3.org/TR/html4/" version="2.0"> <xsl:output method="text"/> <xsl:variable name="some_spaces" select="' '" /> <xsl:template match="/"> <xsl:text>EmplID Name Company </xsl:text> <xsl:text>
</xsl:text> <xsl:for-each select="Root/ab:Row"> <xsl:call-template name="pad"> <xsl:with-param name="Input_text" select="ab:Employee_ID"/> <xsl:with-param name="width" select="12"/> </xsl:call-template> <xsl:call-template name="pad"> <xsl:with-param name="Input_text" select="ab:Name"/> <xsl:with-param name="width" select="25"/> </xsl:call-template> <xsl:call-template name="pad"> <xsl:with-param name="Input_text" select="ab:Company"/> <xsl:with-param name="width" select="15"/> </xsl:call-template> <xsl:text>
</xsl:text> </xsl:for-each> </xsl:template> <xsl:template name="pad"> <xsl:param name="Input_text" /> <xsl:param name="width" /> <xsl:value-of select="substring(concat($Input_text,$some_spaces ), 1, $width)"/> </xsl:template> </xsl:stylesheet>
Output
EmplID Name Company 1001 Emma Dylan GMS USA 1002 James Tyler GMS USA 1003 Oliver Parton GMS Germany 1004 Oliver Parton GMS Germany
Note: If you want to understand the differences between Call-Template Vs Apply-Templates, please follow the link: What are the differences between 'call-template' and 'apply-templates' in XSL?