2010-06-03 32 views
6

爲什麼測試= 「」 一個布爾總是返回true

<xsl:if test="<XPATH to boolean value here>"> 
... 
</xsl:if> 

始終返回true?

由於根據定義布爾值可以是0,1,「false」和「true」,測試布爾值的唯一方法是對這些進行字符串比較。這不可能是正確的。

+0

請問您可以使用XML片段發佈您當前的XPath表達式嗎? – 2010-06-03 20:15:49

+0

這根本不是問題。請給出一個具體示例 - 什麼是XPath表達式,以及什麼是評估此XPath表達式的XML文件(請儘可能最簡單)? – 2010-06-04 16:15:38

+0

想要看一個例子,我想在語法中有一個小小的錯誤。 – 2010-06-07 06:34:35

回答

8

<xsl:if>作品指定若叫boolean功能test。此功能無法按照您的想法操作。如果它的參數計算爲一個節點集(如果你使用路徑作爲它的參數),它將返回true,如果節點集不爲空,否則返回false。實際上,你正在測試一個元素的存在,而不是它的價值。如果foo包含false

<xsl:if test="/path/to/foo"> 

將始終爲true,因爲你實際上在該測試要求是「沒有這個元素存在嗎?」而不是「元素的價值是真的嗎?」元素存在。

是布爾值必須truefalse1,或0是XML模式(which see),而不是XPath,它不知道這個規則另有規定的部分規則。 (XPath 1.0,即XPath 2.0/XQuery 1.0有the fn:boolean function,它確實聰明,也就是XML模式感知,評估布爾值)。要確定XSLT中的值是否爲真,必須明確檢查它:

<xsl:if test="/path/to/foo = 'true' or /path/to/foo = '1'"> 
+0

如果我正確閱讀http://www.w3.org/TR/xpath/#section-Boolean-Functions,那麼這兩個測試之間應該沒有區別。實際上,xsl:if被指定爲通過調用布爾函數來轉換測試結果。 – 2010-06-04 22:24:11

+0

你知道,我知道。糾正。 – 2010-06-05 16:40:50

+0

在上例中,一旦您使用了架構感知處理器,就會遇到問題。由於處理器從架構知道/ path/to/foo是xs:boolean,它將產生一條錯誤消息「不能比較xs:boolean到xs:string」。我有這個問題(具有布爾屬性) - 我真的不知道如何解決它。任何幫助? – 2011-05-11 17:04:59

0

xpath規範給出了布爾函數。因此布爾(值)將始終返回true或false。