簡體   English   中英

如何使用帶有 Java 對象作為參數的 XML 轉換器?

[英]How to use XML transformer with Java object as parameter?

我正在編寫一個 Java 應用程序,其目標是進行 XML 轉換以生成 PDF 文檔。 我使用一個 XML 文件作為輸入,它首先被解析為一個 java 對象。 解析后,我想在 XML 轉換中使用該對象,因此我將其設置為轉換器的參數:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(new StreamSource(stylesheet));
transformer.setParameter("foo", javaObject);

在 xsl 樣式表中調用該對象的實例方法,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:fo="http://www.w3.org/1999/XSL/Format"
                xmlns:pdf="http://xmlgraphics.apache.org/fop/extensions/pdf"
                xmlns:MyClass="foo.bar.MyClass"
>
...
<xsl:param name="foo"/>
<xsl:param name="seller" select="MyClass:myMethod($foo)"/>

我的問題是:這是這樣做的正確方法嗎? 哪種 XSLT 處理器適合以這種方式使用參數? 還有另一種方法嗎?

我嘗試了 Xalan ( org.apache.xalan.xsltc.trax.TransformerFactoryImpl ) 但我得到一個無法找到該方法的異常:

ERROR:  'Cannot find external method 'foo.bar.MyClass.myMethod' (must be public).'
FATAL ERROR:  'Could not compile stylesheet'

該方法是公共的,沒有參數。

對於 Saxon:可以在http://www.saxonica.com/documentation/index.html#!extensibility/functions找到有關對外部 Java 對象的“自反”調用的信息

首先要注意的是,它需要 Saxon-PE 或 -EE。

如果是沒有參數的實例級(非靜態)方法,那么最簡單的方法是:

(a) 聲明一個與類名對應的命名空間,例如

xmlns:date="java:java.util.Date"

(b) 使用外部對象作為第一個參數調用方法:

date:getTime($date)

Saxon 和 Xalan 機制並不完全相同,但有許多相似之處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM