2011-12-08 83 views
-3

我有用於轉換的XSLT樣式表。在這裏我必須使用<xsl:function>來指定用戶定義的功能。當我在這個<xsl:stylesheet></xsl:stylesheet>內執行此操作時,它會引發錯誤。XSLT:如何聲明用戶定義的函數

下面是函數:

<xsl:function name="functx:pad-string-to-length" as="xs:string" 
       xmlns:functx="http://www.functx.com" > 
    <xsl:param name="stringToPad" as="xs:string?"/> 
    <xsl:param name="padChar" as="xs:string"/> 
    <xsl:param name="length" as="xs:integer"/> 

    <xsl:sequence select=" 
    substring(
    string-join (
     ($stringToPad, for $i in (1 to $length) return $padChar) 
     ,'') 
    ,1,$length) 
"/> 

</xsl:function> 
+2

你會得到什麼錯誤? –

+1

同時告訴我們您使用哪種XSLT處理器作爲'xsl:function'是XSLT 2.0中的一項新功能,當然在任何XSLT 1.0處理器中都不支持。因此,除非您使用Saxon 9或AltovaXML或XQSharp或IBM和Intel提供的XSLT 2.0處理器,否則不能使用'xsl:function'。 –

+2

Downvoted的問題:告訴我們有一個錯誤,沒有告訴我們錯誤是什麼,沒有幫助。 –

回答

0

正如@約翰·米切爾說,告訴我們是什麼錯誤可能會有所幫助。但是,我看到你的函數聲明瞭名稱空間 - 確保xmlns:functx="http://www.functx.com"也在樣式表頂部的<xsl:stylesheet>元素中聲明。

顯然,另一件需要檢查的問題是你在函數調用中正確地輸入了你的參數:你的前兩個參數需要引號,但是第三個參數不需要引號(例如<xsl:value-of select="functx:pad-string-to-length('boo', '-', 12)"/>)。

1

問題中定義的函數在語法上是正確的並且看起來有意義。

因此,錯誤出現在您忘記顯示給我們的代碼中 - 更具體地說,該函數是如何與參數一起使用的。

除此之外,還有一些明顯的重構可能性 - 例如用concat()替換不必要的string-join()