如何用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:when test="not(string(categoryName))">
    <xsl:value-of select="other" />
</xsl:when>
<otherwise>
    <xsl:value-of select="categoryName" />
</otherwise>

其他回答

test="categoryName != ''"

编辑:在我看来,这涵盖了从问题中推断出的对“[非]空或空”最可能的解释,包括它是伪代码和我自己早期使用XSLT的经验。例如,“下面的Java的等价物是什么?”:

// Equivalent Java, NOT XSLT
!(categoryName == null || categoryName.equals(""))

有关更多细节,例如,明确识别null和empty,请参阅下面johnvey的回答和/或我从该回答改编的XSLT“小提琴”,其中包括Michael Kay评论中的选项以及第六种可能的解释。

来自Empty Element:

测试某个节点的值是否为空

这取决于你对空的定义。

不包含子节点:not(node()) 不包含文本内容:not(string(.)) 除空格外不包含任何文本:not(normalize-space(.)) 除了注释之外什么都不包含:not(node()[not(self::comment())])

根据我的经验,最好的方法是:

<xsl:when test="not(string(categoryName))">
    <xsl:value-of select="other" />
</xsl:when>
<otherwise>
    <xsl:value-of select="categoryName" />
</otherwise>

如果一个节点在输入xml中没有可用的值,比如xpath,

<node>
    <ErrorCode/>
</node>

String()函数转换为空值。所以这很好:

string(/Node/ErrorCode) =''

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

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