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

标签 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)

最佳答案

如果您使用的是 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>

关于java - 如何从 XSL 文件中调用 Java 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31660064/

相关文章:

java - 如何从 Hibernate saveOrUpdate(Object) 获取查询(不用于日志记录)

java - 接口(interface)类型的多态数组的有效成员

html - 使用 XPath 提取 td 值

xml - 使用 ocaml 创建 xml 文档

xml - JAXP Transformer 通过 DOMSource 返回样式表

javascript - 在 webworker 中获取 XSLTProcessor 的实例?

java - 如何在 WebView 上读取点击链接的 url,而不使用新的 url?

java - 连接到 repo.maven.apache.org :443 failed

javascript - xml对象中的特殊字符问题

java - 如何使用 XSLT 过滤 XML 节点内的元素进行转换?