2010-11-18 61 views
7

我正在創建XSLT文件。 我有一個從XML文件中獲取值的變量。但是可能會發生這樣的情況:在xml中沒有對該值進行引用,並且此時XSL變量將返回False/None(不知道)。我想保留條件,如果變量沒有值,則使用默認值。 如何做到這一點?如何在XSLT中知道變量是否有價值

+0

可能的重複[在XSLT中如何測試以查看變量是否存在?](http://stackoverflow.com/questions/1299808/in-xslt-how-do-you-test-to-see- if-a-variable-exists) – 2014-02-23 02:22:57

回答

18

隨着問題給出的一些細節,你可以做最簡單的測試:

<xsl:if test="$var"> 
    ... 
</xsl:if> 

或者,如果你想爲其他情況下提供的輸出,你可以使用xsl:choose

<xsl:choose> 
    <xsl:when test="not($var)"> <!-- parameter has not been supplied --> 
</xsl:when> 
    <xsl:otherwise> <!--parameter has been supplied --> </xsl:otherwise> 
</xsl:choose> 

第二個示例還將正確處理變量或參數未提供實際值的情況,即它等於空字符串。這是可行的,因爲not('')返回true

+3

雖然你可能會罰款'test =「$ var!=''」'如果測試變量內容與存在性能會好一點。 – scunliffe 2010-11-18 19:50:27

+1

I second @scunliffe - 如果$ var存在但是爲空,'test =「$ var」'仍然會返回true。但是,如果您使用的是早期版本的XSL,則可能需要將其寫入'test =「not($ var ='')」'。 – 2010-11-18 19:54:20

+0

@scunliffe:看到我處理空串的擴展答案。 – 2010-11-18 19:54:22

0

首先,所有的變量都有值,因爲XSLT屬於聲明範例:沒有任何指定的指令,但是當你聲明變量時,你也在爲它的值關係聲明表達式。

如果這個值是一個節點集數據類型(從你的問題來看),那麼你應該測試一個空節點集,以防萬一沒有被選中。空節點集的有效布爾值爲false。因此,如@0xA3已回答:test="$node-set"

您寫道:

如果是變量 沒有值使用默認的一個。怎麼做 ?

那麼,這取決於你正在尋找什麼樣的數據類型。

假設節點集合數據類型:如果您想$節點集-1的值或$節點設置2如果$節點集-1是空的,然後使用:

$node-set-1|$node-set-2[not($node-set-1)] 
+0

@Alejandro:這是一個很好的答案,但是OP沒有在任何地方表明這個值是保存節點集的。它可能只是一個字符串... – 2010-11-18 20:28:35

+0

@Dimitre:好點。我用這種方式讀這句話:「我有一個從XML文件中獲取價值的變量」。 – 2010-11-18 20:41:46

12

你的避風港沒有解釋你的意思是「沒有價值」。 這裏是一個通用的解決方案

not($v) and not(string($v)) 

該表達式的計算結果爲當且僅當true()$v「無值」。

這兩個條件需要滿足,因爲定義爲'0'字符串$v具有價值,但not($v)true()

如果「value」是節點集或者值是標量(如字符串,數字或布爾值),那麼在使用默認值的XSLT 1.0中可以通過不同方式實現。

@Alejandro提供了一種獲取默認值的方法,如果一個應該包含節點集的變量爲空。

如果變量應該包含一個標量,則下面的表達式返回它的值(如果它有一個值),或(否則)所需的默認:

concat($v, substring($default, 1 div (not($v) and not(string($v))))) 
+0

即使有標量值,如何設置變量?只有一個參數不能被設置(並且沒有默認表達式)。只有在這種情況下,參數纔會將空字符串作爲值。 – 2010-11-18 20:53:45

+0

@Alejandro:根據[點11.](http://www.w3.org/TR/xslt#variables),一個變量*可以被綁定到一個值。如果沒有由select屬性或變量綁定元素的內容明確提供的值,則[點11.2](http://www.w3.org/TR/xslt#variable-values)的第三個項目符合綁定該變量爲空字符串。 – 2010-11-18 20:58:54

+1

@ 0xA3:否。它說'可變綁定元素可以以三種可選方式指定變量的值,第三種方式是可變綁定元素具有空的內容並且沒有選擇屬性,那麼變量的值是一個空字符串。所以它有一個明確的價值。沒有沒有價值的東西。 – 2010-11-18 21:05:20

0

我嘗試了很多來自SO的解決方案,我最後的解決方案來自@ dimitre-novatchev,但那個也不是每次都工作。最近我從隨機谷歌搜索中發現了另一種解決方案,想與社區分享。

爲了檢查空變量值,我們可以聲明一個空變量並將其值與測試條件進行比較。下面是代碼片段:

<xsl:variable name="empty_string"/> 
<xsl:if test="testVariableValue != $empty_string"> 
... 
</xsl:if> 

這裏testVariableValue舉行新的變量的值,爲空 場景進行測試。 希望它有助於測試空變量狀態。

0

例如,如果名爲$reference的變量包含任何內容,您可以使用string-length來檢查。

<xsl:choose> 

    <xsl:when test="string-length($reference) > 0"> 
    <xsl:value-of select="$reference" /> 
    </xsl:when> 

    <xsl:otherwise> 
    <xsl:text>some default value</xsl:text> 
    </xsl:otherwise> 

</xsl:choose> 

如果需要的話也可以使用normalize-space

相關問題