2014-12-03 120 views
0

我想使用EXSLT庫在XSLT 1.0中編寫函數。這是我的樣式表。函數調用的參數太多

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:func="http://exslt.org/functions" 
    xmlns:my="http://www.example.com/"> 

    <xsl:output method="text" encoding="UTF-8"/> 

    <func:function name="my:test"> 
     <xsl:param name="param1" /> 
     <xsl:param name="param2" /> 
     <func:result select="concat($param1, $param2)" /> 
    </func:function> 

    <xsl:template match="/"> 
     <xsl:value-of select="my:test('test1', 'test2')" /> 
    </xsl:template> 
</xsl:stylesheet> 

不幸的是,當我嘗試用xsltproc我收到以下錯誤來執行它。

{ http://www.example.com/ }test: called with too many arguments xmlXPathCompiledEval: 1 objects left on the stack. runtime error: file exslt_function_test.xsl line 16 element value-of XPath evaluation returned no result.

我沒有看到任何錯誤。這個函數是用兩個參數定義和調用的。過去有沒有人有類似的問題?

削減任何不必要的評論...不,我不能使用XSLT 2.0。

回答

2

嗯,這是一個很好的謎題。變成libxslt(由xsltproc使用的處理器)將不會執行該功能,除非在<xsl:stylesheet>元素中包含extension-element-prefixes="func"

不知道這是爲什麼 - 其他處理器沒有這樣的問題。

+0

就是這樣。謝謝! – Jagger 2014-12-03 21:52:43

+0

XSLT 1.0是一個非常簡潔的書面規範,很容易錯過它的一些細微之處,其中之一就是術語「元素」和「指令」之間的區別。仔細閱讀「擴展元素」的定義,顯然只有指令可以是擴展元素,而不是聲明;並且擴展元素前綴對於特定於供應商的聲明不是必需的。但你必須非常仔細地閱讀才能得出這個結論。 – 2014-12-03 23:55:47