2008-12-06 85 views
79

我對XSLT完全陌生,無法解決以下代碼出錯的地方。如何創建一個布爾值?

<xsl:variable name="var" select="boolean('false')"/> 

<xsl:if test="$var'">variable is true</xsl:if> 

當它是假的時候它總是返回true。爲什麼?

+2

只是一個建議,但你可能會得到答案的一個更好的口徑,如果你寫你的標題一個適當的問題並避免說話。 – 2008-12-06 12:38:43

+0

謝謝你們,對不起。 – sydlawrence 2008-12-09 07:15:41

回答

160

的是$ var變量的值中定義:

      <xsl:variable name="var" select="boolean('false')"/>

      true()

這是因爲... E在XPath的「false」是一個普通的字符串,而不是false(),這對於booleanfalse()

兩人的XPath布爾值構造函數(注意,它們構造!):

      true()false()

的便利着想的細節將任何值設置爲布爾值在XPath Spec中拼寫。:

「的boolean函數將其參數轉換爲布爾如下:當且僅當它 既不是正或負零 也不爲NaN

  • 一個

    • 一個數字是真節點集是真的當且僅當它 是非空的

    • 一個字符串是真的當且僅當它的 長度爲非零

    • 比四種基本類型以外的類型的對象被轉換成布爾的方式,依賴於該類型 「

    在你的情況下,字符串「false」不是數字0並且長度爲正數,所以應用上面第3條中的規則,產生true()

    因此,在XSLT 1.0,其值是false(),需要編寫的定義定義一個變量爲如下:

          <xsl:variable name="vMyVar" select="false()"/>

    ,或者,如果不這樣做請記住,你總是可以這樣寫:

          <xsl:variable name="vMyVar" select="1 = 0"/>

    (指定任何評估爲false()的表達式),XSLT處理器將爲您完成這項工作。

    在XSLT 2.0總是最好明確指定變量的類型:

          <xsl:variable name="vMyVar" as="xs:boolean" select="false()"/>

  • 16

    你正在使用的boolean()函數確實在做它的工作。對於使用明確的真假值,你應該使用下列功能:

    <xsl:variable name="var_false" select="false()"/> 
    <xsl:variable name="var_true" select="true()"/> 
    

    僅供參考,每MSDN documentation,布爾()返回如下:

    • 如果參數爲負或正數,它被轉換爲布爾值true。
    • 如果參數爲零或NaN值,則將其轉換爲false。
    • 如果參數是一個非空節點集,它將轉換爲true。一個空的節點集被轉換爲false。
    • 如果參數是非空字符串,則將其轉換爲真。一個空字符串被轉換爲false。
    • 如果參數是除四種基本類型之外的類型的對象,則它將以依賴於該類型的方式轉換爲布爾值。
    +0

    您應該重新格式化列表中的倒數第二個項目以突出更多,因爲它是關鍵之一。 「布爾('')」也會產生錯誤。 – Tomalak 2008-12-06 15:16:23

    5

    在這一階段後期有一點也許是,但伊莫處理布爾值是不值得努力。繼承人我如何處理一個布爾值(強制性)從DB回來:

    <xsl:variable name="vTrue" select="true()"/>      
        <xsl:choose> 
         <xsl:when test="string(Mandatory) = string($vTrue)"> 
         <xsl:text>Mandatory</xsl:text> 
         </xsl:when> 
         <xsl:otherwise>   
         </xsl:otherwise> 
        </xsl:choose> 
    

    希望這可以幫助別人