2013-04-23 96 views
5

我想創建一個自定義的XSLT的功能,但每次我收到此錯誤:創建自定義XSLT的功能

「的第一個參數的非靜態Java函數‘compareCI’不是一個有效的對象引用。 「

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:foo="http://whatever"> 

    <xsl:function name="foo:compareCI"> 
    <xsl:param name="string1"/> 
    <xsl:param name="string2"/> 
    <xsl:value-of select="compare(upper-case($string1),upper-case($string2))"/> 
    </xsl:function> 

    <xsl:template match="/"> 
     <xsl:value-of select="foo:compareCI('red','blue')"/> 
    </xsl:template> 

</xsl:stylesheet> 

我希望你們中的某人能幫助我,事先謝謝了很多。

+1

它在我的氧氣末端正常工作。當比較'紅'和'藍'時結果爲'1',比較'紅'和'紅'時結果爲'0' – 2013-04-23 08:42:41

+1

如何運行XSLT和使用哪個處理器? (我使用了Saxon-HE 9.4.0.6,它的工作原理) – FiveO 2013-04-23 08:52:58

+0

我不知道哪個版本使用了Java。我的Java代碼是 TransformerFactory factory = TransformerFactory.newInstance(); Source xslt = new StreamSource(new File(「/ home/xxx/xxx/aliformater-1.xslt」)); 變壓器變壓器= factory.newTransformer(xslt); – javagc 2013-04-23 10:17:56

回答

6

我想你正在嘗試使用Xalan,它是一個XSLT 1.0處理器,因此不能識別xsl:function。發生了什麼是(a)Xalan忽略了xsl:函數,因爲給定樣式表指定version =「2.0」的XSLT 1.0處理器應該忽略它不理解的東西(在規範中稱爲「forwards compatibility mode」) );然後當它看到函數調用foo:compareCI()時,它認爲這必須是對外部Java方法的調用。

您需要使用XSLT 2.0處理器(通常爲Saxon)運行此操作。

+0

好工作。謝謝很多 – javagc 2013-04-23 10:41:27

+0

謝謝。我們正在努力 – Jack 2013-05-14 19:25:53