我想知道如何在XSL 1.0中测试变量是否包含元素值或简单字符串/数字。
<xsl:choose>
<xsl:when test="is the variable an element">
<!-- do some stuff -->
</xsl:when>
<xsl:otherwise>
<!-- do some other stuff -->
</xsl:otherwise>
</xsl:choose>
我有一个类似于下面的XSL。有时变量可能是一个元素,有时该元素可能没有值(即nil =&#34; true&#34;)。这就是我使用$imAStringButICouldHaveBeenAnElementForAllYouKnow[normalize-space()]
测试来检查元素是否有值的原因。
但是,使用Saxon 6.5.5运行此XSL失败,并且该值不是节点集&#39;。我明白为什么,变量确实不是一个节点集;我需要在此之前进行额外的检查,以确认变量是否包含适当的值。
XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="imAStringButICouldHaveBeenAnElementForAllYouKnow" select="'string'"/>
<xsl:template match="/">
<!-- If this is an element I want to know does it have a value? -->
<xsl:if test="$imAStringButICouldHaveBeenAnElementForAllYouKnow[normalize-space()]">
<!-- do some stuff -->
</xsl:if>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:3)
我不认为使用XSLT 1.0是可行的(我希望被证明是错误的)。任何可以在元素上工作的节点集函数,如果应用于字符串,都会导致致命错误。
如何到达您事先不知道变量中的内容的位置?在我看来,真正的问题就在那里。
请注意,可以检查是否存在文本值,无论使用以下内容的变量内容类型如何:
<xsl:if test="normalize-space($myVar)">
当变量是非空的非空白字符串或具有非空的非空白后代文本节点的元素时,这将返回true。
我没有注意到你正在使用Saxon 6.5(直到Michael Kay在他的回答中指出这一点)。在这种情况下,您可以利用Saxon 6.5支持的EXSLT exsl:node-type()
扩展功能,例如:
<xsl:if test="exsl:object-type($myVar)='string'">
<!-- do something -->
</xsl:if>
或
<xsl:if test="exsl:object-type($myVar)='node-set'">
<!-- do something -->
</xsl:if>
答案 1 :(得分:1)
在纯XSLT 1.0中无法完成。如果你运行Saxon 6.5.5那么它应该很容易切换到Saxon 9.5和XSLT 2.0,它提供了巨大的好处,除了提供解决这个问题的“实例”运算符。