如何匹配 xml 值与 XSLT 变量进行比较

How to match a xml value in compare with XSLT variable

我正在尝试将 xml 值与一组 xslt 变量进行比较,但输出为空

这是我的 xslt 文件

<?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>

employeedetails.xml如下

<?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>

谁能告诉我为什么 $MI_GROUP 变量显示为空。

谢谢

因为它使用了 xsl:output 之后定义的变量 $MI_GROUP 而不是 <xsl:choose>.

内部定义的变量之一

要获得输出,您需要定义

<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:value-of select="'A'" />
    </xsl:when>
    ... other cases...
    <xsl:otherwise>
        <xsl:value-of select="'A,C,D,Z'" />
    </xsl:otherwise>
</xsl:choose>
</xsl:variable>
<tr>
    <th><xsl:value-of select="NAME"/></th><th><xsl:value-of select="$MI_GROUP"/></th>
</tr>

这里可以找到两个问题:

  1. 您正在尝试显示变量的值,但它超出了声明该变量的范围。

  2. 您尝试检索文本内容的方式不正确。而不是 <xsl:variable name="DIVISION_CODE" select="'DIVISION_CODE'"/>,你需要使用像这样的东西:<xsl:variable name="DIVISION_CODE" select="DIVISION_CODE/text()"/>。 在您的初始代码中,您仅将变量设置为 DIVISION_CODE 字符串。

以这种方式重构应该可行:

<?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>