如何从XSL文件中调用Java函数?

时间:2015-07-27 17:59:22

标签: java xml xslt apache-fop xalan

我正在使用APACHE FOP将我的xml文件转换为PDF。我有一个XSL文件,我需要调用一个java函数来转换从XML读取的一些值。

我已经在命名空间中声明了包含该函数的java类,并且正在调用静态java函数,如下所示:

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:java="http://xml.apache.org/xslt/java" exclude-result-  prefixes="java"
  xmlns:dateConversion = "urn:java:com.geonexus.worx.sync.reports.ReportMaker">

<fo:block background-color="yellow" padding="1pt"> 
    <fo:inline padding-left="2pt" display-align="center"> 
        <xsl:value-of     select="dateConversion.convertDate(@dateDetected)"/>                                                  
    </fo:inline>    
</fo:block>

但是我一直收到以下错误:

[ERROR] STDERR - ERROR:  'Could not compile stylesheet'
[ERROR] STDERR - FATAL ERROR:  'Could not compile stylesheet'
       :Error checking type of the expression 'funcall(dateConversion.convertDate, [step("attribute", 51)])'.
[ERROR] STDERR - javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
[ERROR] STDERR -    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source)
[ERROR] STDERR -    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source)

1 个答案:

答案 0 :(得分:-1)

如果您使用的是XALAN,请尝试以下。

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:dateConversion="xalan://com.geonexus.worx.sync.reports.ReportMaker"
  extension-element-prefixes="dateConversion"
  exclude-result-prefixes="dateConversion">

<fo:block background-color="yellow" padding="1pt"> 
    <fo:inline padding-left="2pt" display-align="center"> 
        <xsl:value-of     select="dateConversion:convertDate(@dateDetected)"/>                                                  
    </fo:inline>    
</fo:block>

使用简单的XSL和Java类进行更新。

<强> XSL

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:dateConversion="xalan://com.geonexus.worx.sync.reports.ReportMaker"
    extension-element-prefixes="dateConversion" exclude-result-prefixes="dateConversion">

    <xsl:output method="xml" />

    <xsl:template match="/">
        <abcd>
            <xsl:value-of select="dateConversion:convertDate('2005-03-02')" />
        </abcd>
    </xsl:template>
</xsl:stylesheet>

Java类:

package com.geonexus.worx.sync.reports;

public class ReportMaker {

    public static String convertDate(String date) {

        return date.replaceAll("-", ":");
    }
}

<强>输出

<?xml version="1.0" encoding="UTF-8"?><abcd>2005:03:02</abcd>