2010-11-16 59 views
1

我在這裏有一個(次要)問題。我正在調用一個已命名的模板,並將結果分配給一個變量。所以對於這麼好,但我需要處理的模板的返回值的類型是整數而不是文本。xsl:call-template:返回一個數字而不是要分配給變量的文本

我不知道是否有辦法實現這一點,而不必使用臨時變量?

下面是一些示例代碼:

<xsl:variable name="tmp"> 
    <xsl:call-template name="mytemplate"> 
     <xsl:with-param name="x" select="123"/> 
    </xsl:call-template> 
</xsl:variable> 

<xsl:variable name="myvar" select="number($tmp)"/> 

<xsl:template name="mytemplate"> 
    <xsl:param name="x"/> 
    <xsl:value-of select="$x"/> 
</xsl:template> 

不介意的代碼,因爲它是我的模板所做的事情過於簡單化。還請注意,我試圖返回<xsl:value-of select="number($x)"/>但無濟於事。

任何幫助非常感謝。 TIA

+1

您可能想要檢查XSLT 2.0處理器是否可用於您的系統或平臺,使用XSLT 2.0您可以使用'xsl:sequence' http://www.w3.org/TR/xslt20/#constructing-sequences並且可以使用'as'屬性http://www.w3.org/TR/xslt20/#element-template來確保返回某種類型。 – 2010-11-16 14:03:13

+0

感謝Martin,太糟糕了XSLT 2.0在這裏不是一個選項...... PHP - 我需要多說些什麼?!? – aefxx 2010-11-16 14:04:59

回答

1

首先,$tmp數據類型是Result Tree Fragment。因此,除了複製外,在$tmp所有允許的操作中,只計算其字符串值。

XPath對於隱式轉換有很多規則。一般來說,無論何時一個運算符或函數將一個數字數據類型作爲參數,該表達式將被轉換爲具有number()函數的數字。底線:在大多數情況下,您都不需要這種明確的轉換。

+0

在這種情況下,我需要明確的轉換,因爲即使'$ tmp =「0」'not($ tmp)'也將是'false'。我知道我有幾個其他選項可供測試 - 比如說'$ tmp = 0'。也許這只是我的審美抽象,但我寧願使用'not'運算符。 – aefxx 2010-11-16 13:45:28

+0

@aefxx:那麼你的評論應該是有問題的。也不是一個隱含的數字布爾鑄造它不是一個好的選擇... – 2010-11-16 14:05:10

+0

@Alejandro:你說得對,也不是一個好的選擇。不管怎麼說,還是要謝謝你。 – aefxx 2010-11-16 14:10:15

1

正如@Alejandro指出的那樣,您不需要明確鑄造編號爲

如果您打算將此數字作爲數字使用,但要將數字表示法用作中間類型,則您確實需要投射,因爲$tmp變量中的RTF可能無法直接轉換爲鍵入想要的。

您需要:

boolean(number($tmp)) 

爲RTF或任何樹轉換爲布爾達可以有兩個不同的值。

boolean(someNode) 

總是true() - by definition

相關問題