如何在xslt文件中调用外部java函数?

时间:2011-10-11 22:29:44

标签: java xslt

我有这个xslt文件,我需要调用放在同一个应用程序中其他地方的java函数。    在xslt文件中我有

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:java="java" 
                xmlns:test_my="vobs.plugins.WikiParser.WikiParser"
                version="2.0">
  <xsl:output indent="yes" method="html"/>
  <xsl:template match="/">
    <H1>
      <xsl:value-of select="WikiDescription/Title"/>
    </H1>
    Summary: <xsl:value-of select="WikiDescription/Description"/>
    <xsl:variable name="text">                      
      <xsl:value-of select="WikiDescription/Text"/>
    </xsl:variable>
    <p>
      <xsl:value-of select="test_my:parse2($text)" 
                    disable-output-escaping="yes"/>
    </p>

但是当我尝试执行此xlst文件时,我收到以下错误

XSL transform reported error: 
XPath syntax error at char 21 on line -1 in {test_my:parse2($text)}: 
Cannot find a matching 1-argument function named 
{vobs.plugins.WikiParser.WikiParser}parse2()
似乎它无法找到java类,那么正确的方法是什么?一些代码示例会更好。提前谢谢!

3 个答案:

答案 0 :(得分:3)

我遇到了完全相同的问题,这解决了我urn:java:java:都失败的问题。

假设您正在使用Xalan进行转换,则应将xmlns:test_my="vobs.plugins.WikiParser.WikiParser"更改为xmlns:test_my="xalan://vobs.plugins.WikiParser.WikiParser"

答案 1 :(得分:3)

这取决于您使用的XSLT转换处理器。撒克逊人使用urn:java:; Xalan使用xalan://

答案 2 :(得分:2)

您需要将名称空间声明(在xsl:stylesheet元素中)从xmlns:test_my="vobs.plugins.WikiParser.WikiParser"更改为xmlns:test_my="urn:java:vobs.plugins.WikiParser.WikiParser"

基本原理如下:为了使用包a.b中的类C,您需要定义名称空间前缀并将其与urn:java:a.b.C相关联。

如果我正确理解XSL,则在导入不属于标准库的Java代码时需要urn:前缀(如您的情况)。如果您只需要导入标准库类,那么“java:”就可以了。

(进一步详情:http://cafeconleche.org/books/xmljava/chapters/ch17s03.html

[编辑:改变“java:” - &gt; “瓮:JAVA:”]