如何匹配 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>
这里可以找到两个问题:
您正在尝试显示变量的值,但它超出了声明该变量的范围。
您尝试检索文本内容的方式不正确。而不是 <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>
我正在尝试将 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>
这里可以找到两个问题:
您正在尝试显示变量的值,但它超出了声明该变量的范围。
您尝试检索文本内容的方式不正确。而不是
<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>