Search code examples
xmlxsltibm-datapower

How to match a xml value in compare with XSLT variable


I am trying to compare a xml value with set of xslt variables but the output is empty

Here is my xslt file

<?xml version="1.0" encoding="UTF-8"?>
<!-- New document created with EditiX at Thu Feb 18 19:08:23 IST 2016 -->
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
        <xsl:variable name="MI_GROUP"/>
    <xsl:template match="/">


        <xsl:variable name="A_Div_Code" select="'47,48,49,50'"/>
        <xsl:variable name="A_Dept_Code" select="'KT,VT,SF,MQ'"/>
        <xsl:variable name="A_Job_Level" select="'4B,2B,7B'"/>

        <xsl:variable name="D_Div_Code" select="'70,65,42,12,76,31,47,48,49,50'"/>
        <xsl:variable name="D_Dept_Code" select="'LM,MX,PQ,ML,KL,KO,KT,VT,SF,MQ'"/>
        <xsl:variable name="D_Job_Level" select="'4D,2D,3D,4C,2C,7C,4B,2B,7B'"/>

        <xsl:variable name="C_Div_Code" select="'12,76,31,47,48,49,50'"/>
        <xsl:variable name="C_Dept_Code" select="'ML,KL,KO,KT,VT,SF,MQ'"/>
        <xsl:variable name="C_Job_Level" select="'4C,2C,7C,4B,2B,7B'"/>


    <xsl:for-each 
        select="COMPANY/EMPLOYEE" >

        <xsl:variable name="DIVISION_CODE" select="'DIVISION_CODE'"/>
        <xsl:variable name="DEPT_CODE" select="'DEPT_CODE'"/>
        <xsl:variable name="JOB_LEVEL" select="'JOB_LEVEL'"/>

        <xsl:choose>
            <xsl:when test="contains($A_Div_Code, $DIVISION_CODE) and contains($A_Dept_Code, $DEPT_CODE) and contains($A_Job_Level, $JOB_LEVEL)">
                <xsl:variable name="MI_GROUP" select="'A'" />
            </xsl:when>
            <xsl:when test="contains($C_Div_Code, $DIVISION_CODE) and contains($C_Dept_Code, $DEPT_CODE) and contains($C_Job_Level, $JOB_LEVEL)">
                <xsl:variable name="MI_GROUP" select="'A,C'" />
            </xsl:when>
            <xsl:when test="contains($D_Div_Code, $DIVISION_CODE) and contains($D_Dept_Code, $DEPT_CODE) and contains($D_Job_Level, $JOB_LEVEL)">
                <xsl:variable name="MI_GROUP" select="'A,C,D'" />
            </xsl:when>
            <xsl:otherwise>
                <xsl:variable name="MI_GROUP" select="'A,C,D,Z'" />
            </xsl:otherwise>
        </xsl:choose>
        <tr>
            <th><xsl:value-of select="NAME"/></th><th><xsl:value-of select="$MI_GROUP"/></th>
        </tr>
    </xsl:for-each>

    </xsl:template>

</xsl:stylesheet>

And the employeedetails.xml is as follows

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="employee-detailcheck.xsl"?>

<COMPANY>

<EMPLOYEE>
    <DIVISION_CODE>47</DIVISION_CODE>
    <DEPT_CODE>KT</DEPT_CODE>
    <JOB_LEVEL>4B</JOB_LEVEL>
    <NAME>Vikram</NAME>
</EMPLOYEE>
<EMPLOYEE>
    <DIVISION_CODE>70</DIVISION_CODE>
    <DEPT_CODE>LM</DEPT_CODE>
    <JOB_LEVEL>4D</JOB_LEVEL>
    <NAME>VISHWAS</NAME>
</EMPLOYEE>
<EMPLOYEE>
    <DIVISION_CODE>47</DIVISION_CODE>
    <DEPT_CODE>KT</DEPT_CODE>
    <JOB_LEVEL>4B</JOB_LEVEL>
    <NAME>Radzie</NAME>
</EMPLOYEE>
<EMPLOYEE>
    <DIVISION_CODE>12</DIVISION_CODE>
    <DEPT_CODE>ML</DEPT_CODE>
    <JOB_LEVEL>4C</JOB_LEVEL>
    <NAME>Vishnu</NAME>
</EMPLOYEE>

</COMPANY>

Can any one let me know why the $MI_GROUP variable is showing empty .

Thanks


Solution

  • Two problems can be found here:

    1. You are trying to display the value of the variable but it is out of the scope where this variable has been declared.

    2. you are improperly trying to retrieve text content. Instead of <xsl:variable name="DIVISION_CODE" select="'DIVISION_CODE'"/>, you need to used something like : <xsl:variable name="DIVISION_CODE" select="DIVISION_CODE/text()"/>. In your initial code you are only setting your variable to the DIVISION_CODE string.

    Refactoring that way should work:

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- New document created with EditiX at Thu Feb 18 19:08:23 IST 2016 -->
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" indent="yes"/>
            <xsl:variable name="MI_GROUP"/>
            <xsl:template match="/">
    
    
            <xsl:variable name="DIVISION_CODE" select="DIVISION_CODE/text()"/>
            <xsl:variable name="DEPT_CODE" select="DEPT_CODE/text()"/>
            <xsl:variable name="JOB_LEVEL" select="JOB_LEVEL/text()"/>
    
            <xsl:variable name="D_Div_Code" select="'70,65,42,12,76,31,47,48,49,50'"/>
            <xsl:variable name="D_Dept_Code" select="'LM,MX,PQ,ML,KL,KO,KT,VT,SF,MQ'"/>
            <xsl:variable name="D_Job_Level" select="'4D,2D,3D,4C,2C,7C,4B,2B,7B'"/>
    
            <xsl:variable name="C_Div_Code" select="'12,76,31,47,48,49,50'"/>
            <xsl:variable name="C_Dept_Code" select="'ML,KL,KO,KT,VT,SF,MQ'"/>
            <xsl:variable name="C_Job_Level" select="'4C,2C,7C,4B,2B,7B'"/>
    
    
        <xsl:for-each 
            select="COMPANY/EMPLOYEE" >
    
            <xsl:variable name="DIVISION_CODE" select="'DIVISION_CODE'"/>
            <xsl:variable name="DEPT_CODE" select="'DEPT_CODE'"/>
            <xsl:variable name="JOB_LEVEL" select="'JOB_LEVEL'"/>
    
            <xsl:variable name="MI_GROUP">
            <xsl:choose>
                <xsl:when test="contains($A_Div_Code, $DIVISION_CODE) and contains($A_Dept_Code, $DEPT_CODE) and contains($A_Job_Level, $JOB_LEVEL)">
                    <xsl:text>A</xsl:text>
                </xsl:when>
                <xsl:when test="contains($C_Div_Code, $DIVISION_CODE) and contains($C_Dept_Code, $DEPT_CODE) and contains($C_Job_Level, $JOB_LEVEL)">
                    <xsl:text>A,C</xsl:text>
                </xsl:when>
                <xsl:when test="contains($D_Div_Code, $DIVISION_CODE) and contains($D_Dept_Code, $DEPT_CODE) and contains($D_Job_Level, $JOB_LEVEL)">
                    <xsl:text>A,C,D</xsl:text>
                </xsl:when>
                <xsl:otherwise>
                  <xsl:text>A,C,D,Z</xsl:text>
                </xsl:otherwise>
            </xsl:choose>
            </xsl:variable>
            <tr>
                <th><xsl:value-of select="NAME"/></th><th><xsl:value-of select="$MI_GROUP"/></th>
            </tr>
        </xsl:for-each>
    
        </xsl:template>
    
    </xsl:stylesheet>