【问题标题】:How to match a xml value in compare with XSLT variable如何将 xml 值与 XSLT 变量进行比较
【发布时间】:2016-02-23 13:21:37
【问题描述】:

我正在尝试将 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 变量显示为空。

谢谢

【问题讨论】:

    标签: xml xslt ibm-datapower


    【解决方案1】:

    这里可以找到两个问题:

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

    2. 您不正确地尝试检索文本内容。而不是&lt;xsl:variable name="DIVISION_CODE" select="'DIVISION_CODE'"/&gt;,您需要使用类似:&lt;xsl:variable name="DIVISION_CODE" select="DIVISION_CODE/text()"/&gt;。 在您的初始代码中,您只需将变量设置为 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>
    

    【讨论】:

    • 是的,我得到了一些价值,但它仍然没有正确匹配它向我显示 &lt;xsl:otherwise&gt; &lt;xsl:text&gt;A,C,D,Z&lt;/xsl:text&gt; &lt;/xsl:otherwise&gt; 这部分代码的值,你能帮我格式化 XSL 变量的内容,以便我可以正确匹配字符串
    • 那么请进一步解释您想要做什么的逻辑,并提供您期望获得的示例输出。谢谢。
    • 好的,我正在从 XML 中获取员工详细信息,我正在尝试将其与 XSLT 中定义的变量进行匹配,例如,如果您使用 &lt;EMPLOYEE&gt; &lt;DIVISION_CODE&gt;70&lt;/DIVISION_CODE&gt; &lt;DEPT_CODE&gt;LM&lt;/DEPT_CODE&gt; &lt;JOB_LEVEL&gt;4D&lt;/JOB_LEVEL&gt; &lt;NAME&gt;VISHWAS&lt;/NAME&gt; &lt;/EMPLOYEE&gt; 这部分 XML,它应显示 A、C、D 作为输出
    • 好的,我明白了。我更新了答案。你也可以去xsltransform.net/3NJ38ZL 看到它“现场”工作。
    【解决方案2】:

    因为它使用xsl:output 之后定义的变量$MI_GROUP,而不是&lt;xsl:choose&gt; 内部定义的变量之一。

    要获得你需要定义的输出

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多