2011-03-10 89 views
1

XSLT 1.0 contains()函數和空標記存在問題。XSLT包含()和空標記

我有這樣的XSLT樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="test/tester"> 
      <test> 
       <xsl:value-of select="."/> 
       <xsl:text>: </xsl:text> 
       <xsl:value-of select="contains('11,22,33', .)"/> 
      </test> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

和輸入是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<test> 
    <tester>11</tester> 
    <tester>22</tester> 
    <tester>33</tester> 
    <tester>xx</tester> 
    <tester/> 
</test> 

結果是這樣的:在這裏

<?xml version="1.0" encoding="UTF-8"?> 
<test>11: true</test> 
<test>22: true</test> 
<test>33: true</test> 
<test>xx: false</test> 
<test>: true</test> 

問題是,我希望功能如果<tester>標籤爲空則返回false。然而它對於最後一行是正確的。我怎樣才能避免這種情況,除了首先檢查空值的標籤值並將變量設置爲某個值,我知道該值不在值列表中?

謝謝!

+0

但'FN:contains'正常工作,因爲你的字符串實際上包含一個空字符串。你應該通過f.i來改變邏輯。使用'contains'處理僅包含具有內容或其他內容的標籤。 – 2011-03-10 07:38:23

+0

@Alex我會理解,如果空字符串包含空字符串,但不是'11,22,33'包含空字符串。但那只是我:) – Jari 2011-03-10 07:55:59

+0

好問題,+1。請參閱我的回答以獲得解釋和完整,簡短和簡單的解決方案。 :) – 2011-03-10 14:03:38

回答

2

這是標準,根據W3C Spec行爲

爲了避免這種情況,使用

contains(',11,22,33,', concat(',', ., ',')) 
+0

+1通用XPath 1.0「順序」表達式。 – 2011-03-10 17:59:55

+0

謝謝,有用的提示! – Jari 2011-03-14 06:49:46

+0

@Jari:不客氣。 – 2011-03-14 12:44:22

2

的XPath 1.0規範是對此事很模糊,但XQuery 1.0和XPath 2.0中的功能規格explicitly declares

If the value of $arg2 is the zero-length string, then the function returns true. 

我不認爲這是一個新的東西,只是一個澄清的舊功能。

+0

+1正確的解釋。在邏輯上,任何集都包含空集。 – 2011-03-10 17:59:13

+0

謝謝,應該檢查一下自己。 – Jari 2011-03-14 06:59:54