Workday XSLT 08- Basic XSLT Examples (Fixed Width)

Workday XSLT 08- Basic XSLT Examples (Fixed Width)

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>&#xa;</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>&#xa;</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>&#xa;</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>&#xa;</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>&#xa;</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>&#xa;</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>&#xa;</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>&#xa;</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?