如何用XSL检查一个值是空还是空?
例如,如果categoryName为空?
这可能是最简单的XPath表达式(accept answer中的表达式提供了相反的测试,如果否定,则会更长):
not(string(categoryName))
解释:
上面的not()函数的参数是false(),恰好当上下文项没有categoryName子项(“null”),或者(单个这样的)categoryName子项有字符串值——空字符串时。
我使用的是“当选择”结构。
例如:
< xsl: choose >
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " /> .
< / xsl: when >
< xsl:否则>
<xsl:value-of select="other" /> .
< / xsl:否则>
< / xsl: choose >
在XSLT 2.0的使用中:
<xsl:copy-of select="concat(categoryName, $vOther[not(string(current()/categoryName))])"/>
下面是一个完整的例子:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vOther" select="'Other'"/>
<xsl:template match="/">
<xsl:copy-of select="concat(categoryName,$vOther[not(string(current()/categoryName))])"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下XML文档时:
<categoryName>X</categoryName>
生成所需的正确结果:
X
当应用于这个XML文档时:
<categoryName></categoryName>
或者关于这个:
<categoryName/>
或者在这个上面
<somethingElse>Y</somethingElse>
正确的结果是:
Other
类似地,使用以下XSLT 1.0转换:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vOther" select="'Other'"/>
<xsl:template match="/">
<xsl:copy-of select=
"concat(categoryName, substring($vOther, 1 div not(string(categoryName))))"/>
</xsl:template>
</xsl:stylesheet>
注意:完全没有使用条件句。在这个漂亮的Pluralsight课程中了解更多关于避免条件结构的重要性:
.NET中的战术设计模式:控制流