簡體   English   中英

與XSLT變量比較時如何匹配xml值

[英]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變量顯示為empty。

謝謝

因為它使用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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM