我正在創建XSLT文件。 我有一個從XML文件中獲取值的變量。但是可能會發生這樣的情況:在xml中沒有對該值進行引用,並且此時XSL變量將返回False/None(不知道)。我想保留條件,如果變量沒有值,則使用默認值。 如何做到這一點?如何在XSLT中知道變量是否有價值
回答
隨着問題給出的一些細節,你可以做最簡單的測試:
<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
。
雖然你可能會罰款'test =「$ var!=''」'如果測試變量內容與存在性能會好一點。 – scunliffe 2010-11-18 19:50:27
I second @scunliffe - 如果$ var存在但是爲空,'test =「$ var」'仍然會返回true。但是,如果您使用的是早期版本的XSL,則可能需要將其寫入'test =「not($ var ='')」'。 – 2010-11-18 19:54:20
@scunliffe:看到我處理空串的擴展答案。 – 2010-11-18 19:54:22
首先,所有的變量都有值,因爲XSLT屬於聲明範例:沒有任何指定的指令,但是當你聲明變量時,你也在爲它的值關係聲明表達式。
如果這個值是一個節點集數據類型(從你的問題來看),那麼你應該測試一個空節點集,以防萬一沒有被選中。空節點集的有效布爾值爲false。因此,如@0xA3已回答:test="$node-set"
。
您寫道:
如果是變量 沒有值使用默認的一個。怎麼做 ?
那麼,這取決於你正在尋找什麼樣的數據類型。
假設節點集合數據類型:如果您想$節點集-1的值或$節點設置2如果$節點集-1是空的,然後使用:
$node-set-1|$node-set-2[not($node-set-1)]
@Alejandro:這是一個很好的答案,但是OP沒有在任何地方表明這個值是保存節點集的。它可能只是一個字符串... – 2010-11-18 20:28:35
@Dimitre:好點。我用這種方式讀這句話:「我有一個從XML文件中獲取價值的變量」。 – 2010-11-18 20:41:46
你的避風港沒有解釋你的意思是「沒有價值」。 這裏是一個通用的解決方案:
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)))))
即使有標量值,如何設置變量?只有一個參數不能被設置(並且沒有默認表達式)。只有在這種情況下,參數纔會將空字符串作爲值。 – 2010-11-18 20:53:45
@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
@ 0xA3:否。它說'可變綁定元素可以以三種可選方式指定變量的值,第三種方式是可變綁定元素具有空的內容並且沒有選擇屬性,那麼變量的值是一個空字符串。所以它有一個明確的價值。沒有沒有價值的東西。 – 2010-11-18 21:05:20
我嘗試了很多來自SO的解決方案,我最後的解決方案來自@ dimitre-novatchev,但那個也不是每次都工作。最近我從隨機谷歌搜索中發現了另一種解決方案,想與社區分享。
爲了檢查空變量值,我們可以聲明一個空變量並將其值與測試條件進行比較。下面是代碼片段:
<xsl:variable name="empty_string"/>
<xsl:if test="testVariableValue != $empty_string">
...
</xsl:if>
這裏testVariableValue舉行新的變量的值,爲空 場景進行測試。 希望它有助於測試空變量狀態。
例如,如果名爲$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
。
- 1. 您是否知道任何有價值的XML_Serializer替代方案?
- 2. 如何知道內存中的變量是否是指針?
- 3. 變量沒有得到價值,我不知道爲什麼
- 4. 我如何知道變量是否是私人的?
- 5. 如何知道Sql Server中的表中是否沒有值
- 6. 價值如何測試是否爲零在XSLT 1.0
- 7. 如何在XSLT中檢查變量是否爲空或空?
- 8. 如何知道什麼改變了變量值在xcode swift
- 9. 如何知道雙變量中NAN值的存在?
- 10. 如何知道在pom.xml中定義的值變量?
- 11. 這個Javascript變量如何有價值?
- 12. 如何知道是否
- 13. 知道一個變量是否是javascript中的本地對象
- 14. 是否有差異使用self.variable ='一些價值'只是變量='一些價值'的實例變量
- 15. SQL:如何知道數據庫中是否存在一組值?
- 16. 如何知道數值是否在數組列表中?
- 17. 如何知道數據庫中是否存在此類值? (ADO.NET)
- 18. 是否有可能「盜版」一個會話變量(我不想知道如何)
- 19. 如何知道用戶是否在AD組中有效存在
- 20. 通知中心 - 如何知道是否存在「未讀」通知?
- 21. 是否有可能在變量中更改變量的值?
- 22. C++ - 如何知道map :: upper_bound()是否沒有返回值?
- 23. XSL變量沒有價值
- 24. 將全局變量傳遞給函數是否有價值?
- 25. 如何知道是否存在NSUserDefault?
- 26. 如何知道我是否在回傳?
- 27. 如何知道是否正在對angular2
- 28. 有沒有辦法知道函數是否返回到PHP中的變量?
- 29. 不知道爲什麼價值沒有改變
- 30. 如何才能知道在MySQL中是否有事務打開?
可能的重複[在XSLT中如何測試以查看變量是否存在?](http://stackoverflow.com/questions/1299808/in-xslt-how-do-you-test-to-see- if-a-variable-exists) – 2014-02-23 02:22:57