如何检查字符串变量的值是“是”还是“否”?
<xsl:variable name="test1" select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test1']/DBE:String"/>
<xsl:variable name="test2" select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test2']/DBE:String"/>
<xsl:choose>
<xsl:when test="$test1 = 'Yes'>
<xsl:apply-templates select="YES"/>
</xsl:when>
<xsl:when test="$test2 = 'Yes'>
<xsl:apply-templates select="Invalid"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test3']/DBE:String"/>
</xsl:otherwise>
</xsl:choose>
请告诉我上面的错误。
答案 0 :(得分:3)
您的问题不是when
测试,而是<xsl:apply-templates select="YES"/>
和<xsl:apply-templates select="Invalid"/>
。 YES
和Invalid
不对应任何东西 - 在XSL中没有常量的概念,它看起来不像XPath表达式 - 因此没有什么可以应用于。
相反,尝试这样的事情:
<xsl:variable
name="test1"
select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test1']/DBE:String"
/>
<xsl:variable
name="test2"
select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test2']/DBE:String"
/>
<xsl:choose>
<xsl:when test="lower-case($test1) = 'yes'>
<xsl:apply-templates
select="."
mode="test-yes"
/>
</xsl:when>
<xsl:when test="lower-case($test2) = 'yes'>
<xsl:apply-templates
select="."
mode="test-invalid"
/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates
select="DBE:OBJECT/DBE:ATTRIBUTE[@name='test3']/DBE:String"
/>
</xsl:otherwise>
</xsl:choose>
<xsl:template match="*" mode="test-yes">
Yes!!!
</xsl:template>
<xsl:template match="*" mode="test-invalid">
Invalid!!!
</xsl:template>
另外,请记住,变量在XSL中可能“昂贵”;处理引擎获取您正在引用的节点集的完整副本,而不仅仅是保留指针,因此在处理该部分上下文时,您将携带内存中节点集的“权重”。如果你可以进行内联测试,那就更好了。
事实上,与优化的choose
流量相比,apply-templates
相对较慢。您的处理速度会快得多。如果您确定只有一个测试匹配,那么最好做这样的事情:
<xsl:apply-templates
mode="test-yes"
select="
DBE:OBJECT/DBE:ATTRIBUTE[@name='test1']/DBE:String[lower-case(.) = 'yes']
" />
<xsl:apply-templates
mode="test-invalid"
select="
DBE:OBJECT/DBE:ATTRIBUTE[@name='test2']/DBE:String[lower-case(.) = 'yes']
" />
<xsl:apply-templates
mode="test-otherwise"
select="
DBE:OBJECT/DBE:ATTRIBUTE[@name='test2']/DBE:String
" />
<xsl:template match="*" mode="test-yes">
Yes!!!
</xsl:template>
<xsl:template match="*" mode="test-invalid">
Invalid!!!
</xsl:template>
<xsl:template match="*" mode="test-otherwise">
Something else!
</xsl:template>
如果您无法确定是否可以将“内联”的其他测试添加到apply-templates
,例如:
<xsl:apply-templates
mode="test-yes"
select="
DBE:OBJECT/DBE:ATTRIBUTE[
@name='test1'
]/DBE:String[
lower-case(.) = 'yes'
and
not(
lower-case(../DBE:ATTRIBUTE[@name='test2']/DBE:String/text()) = 'yes'
)
]
" />
<!-- etc... -->
答案 1 :(得分:1)
元素:
<xsl:apply-templates select="YES"/>
将尝试查找当前上下文的子元素,其限定名称为YES,即它正在寻找类似的内容:
<YES ...>...</YES>
这几乎肯定不是你想要的。这是一个容易犯的错误,而且我经常犯这个错误。