2013-04-23 76 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