2016-01-13 109 views
0

我在XSLT中有一個問題。我通常做下列檢查XML文檔的變量/節點的非無效需要以正確的方式確認

<Blocks> 
    <Block ID="1"/> 
    <Block ID="2"/> 
    <Block ID="3"/> 
</Blocks> 

<xsl:variable name="var1" select="Blocks/Block[@ID = 1]"/> 
<xsl:if test="$var1 != ''"> 
    <output>True</output> 
</xsl:if> 

人在我的公司說,$var1 != ''不工作始終(指作品有時並不起作用有時)和不使用這樣的事情(但使用test="$var1")。需要確認,如果這是正確的,並使用$var1 != ''

+0

如果有空格和換行字符出現在標籤中,例如' '。它不會是空的。添加一個'normalize-space()'函數來確保。 –

+0

您能否顯示您認爲適用的地方以及您認爲不適用的地方的代碼。請包括預期的輸出。 –

+1

這取決於你需要檢查什麼,如果你想檢查是否有任何節點已被選中,那麼檢查'',如果你想檢查所選節點是否包含一些內容,以便字符串值不是空字符串,然後使用您的檢查。 –

回答

0

如果你想要檢查的是元素是否有文本值,例如以防止空<Block />元件,我傾向於使用text()函數而不是字符串比較:

<xsl:if test="Blocks/Block[@ID = 1]/text()"> 
    <output>True</output> 
</xsl:if> 

該表達式檢查該文本節點是否存在。相反,字符串比較(= '')從元素的文本節點提取字符串,並檢查它是否等於''。從理論上講,即使結果相同,後者效率也不如前者。

(雖然XSLT處理器和XPath引擎可能實現了空字符串比較的優化)。

注意:如果要指示XSLT忽略微不足道空格,只保留其中包含非空白元素(除在XSL spec規定的其他標準文本節點,你可以使用<xsl:strip-space />指令與像的配置<xsl:strip-space elements="*"/>

這將有效地防止包含回車,換行,製表符元素,只有空格(#X20,X9#,#xD或#xA實體)的表達。

+0

你能舉一個例子,你的測試將返回一個與OP測試返回的結果不同的結果嗎? –

+0

OP不需要與他/她不同的結果。他們只需要確認他們的方法是否正確,並提出可能的替代方案。 – raulk

+0

恕我直言,OP要求確認他們的測試不一致的說法。你的回答似乎是說它可能是,而你的測試在某種程度上更好。 –