如何用XSL检查一个值是空还是空?

例如,如果categoryName为空?我使用的是“当选择”结构。

例如:

<xsl:choose>
    <xsl:when test="categoryName !=null">
        <xsl:value-of select="categoryName " />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="other" />
    </xsl:otherwise>
</xsl:choose>

当前回答

如何用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中的战术设计模式:控制流

其他回答

前两个处理空值,后两个处理空字符串。

<xsl:if test="USER/FIRSTNAME">
    USERNAME is not null
</xsl:if>
<xsl:if test="not(USER/FIRSTNAME)">
    USERNAME is null
 </xsl:if>
 <xsl:if test="USER/FIRSTNAME=''">
     USERNAME is empty string
 </xsl:if>
 <xsl:if test="USER/FIRSTNAME!=''">
     USERNAME is not empty string
 </xsl:if>

关于什么?

test="not(normalize-space(categoryName)='')"

实际上,我发现它更好的只是测试字符串长度,因为很多时候字段不是空的,只是空的

< xsl:当测试= " - length (field-you-want-to-test) < 1 >

这对我来说很管用:

<xsl:choose>
  <xsl:when test="string(number(categoryName)) = 'NaN'"> - </xsl:when> 
  <xsl:otherwise> 
    <xsl:number value="categoryName" />
  </xsl:otherwise>
</xsl:choose>

或者反过来说:

<xsl:choose>
  <xsl:when test="string(number(categoryName)) != 'NaN'">
    <xsl:number value="categoryName" />
  </xsl:when> 
  <xsl:otherwise> - </xsl:otherwise>
</xsl:choose>

注意:如果你不检查空值或不处理空值,IE7将返回-2147483648而不是NaN。

如果有可能元素在XML中不存在,我将测试元素是否存在以及字符串长度是否大于零:

<xsl:choose>
    <xsl:when test="categoryName and string-length(categoryName) &gt; 0">
        <xsl:value-of select="categoryName " />
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="other" />
    </xsl:otherwise>
</xsl:choose>