编写具有多个条件的xsl when子句

时间:2015-02-16 22:58:01

标签: xml xslt xpath

我对xslt相当新,所以我可能会遗漏一些简单的东西,但我似乎无法找到它。我正在尝试构造一个具有多个条件的when子句。这就是我所拥有的。

<xsl:when test="(string-length(current()/SSN/text())) = 9 AND not(string(number(current()/SSN/text())) = 'NaN')">
    <IdCodeQualifier>
        <xsl:value-of select="'34'" />
    </IdCodeQualifier>
    <SSN>
        <xsl:value-of select="current()/SSN/text()" />                  
    </SSN>
</xsl:when>

这导致:

  

(97,16)的XSLT编译错误。有关详细信息,请参阅InnerException。 'boolean((string-length(current()/ SSN / text()))= 9 AND not(string(number(current()/ SSN / text()))='NaN'))'是无效的XPath表达。 'boolean((string-length(current()/ SSN / text()))= 9 AND not(string(number(current()/ SSN / text()))='NaN'))'有一个无效的令牌

然而这很好。

<xsl:when test="string-length(current()/SSN/text()) = 9">
    <xsl:if  test="string(number(current()/SSN/text())) != 'NaN'">
        <IdCodeQualifier>
            <xsl:value-of select="'34'" />
        </IdCodeQualifier>
        <SSN>
            <xsl:value-of select="current()/SSN/text()" />                  
        </SSN>
    </xsl:if>
</xsl:when>

那么我错过了什么?

2 个答案:

答案 0 :(得分:1)

使用and代替AND。 XPath区分大小写。

答案 1 :(得分:1)

正如Kiril所说,AND无效XPath。

你的表达也比他们需要的更冗长。你应该能够解决这个问题:

<xsl:when test="string-length(SSN) = 9 and number(SSN) = number(SSN)">
    <IdCodeQualifier>
        <xsl:value-of select="'34'" />
    </IdCodeQualifier>
    <SSN>
        <xsl:value-of select="SSN" />                  
    </SSN>
</xsl:when>

一般情况下,我建议限制您使用text(),除非您有特殊需要使用它。