如何以 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'
方法是 public 并且没有参数。
对于 Saxon:有关 "reflexive" 调用外部 Java 对象的信息可以在 http://www.saxonica.com/documentation/index.html#!extensibility/functions
找到
首先要注意的是它需要 Saxon-PE 或 -EE。
如果是没有参数的实例级(非静态)方法,那么最简单的方法是:
(a)声明class名称对应的命名空间,例如
xmlns:date="java:java.util.Date"
(b) 以外部对象作为第一个参数调用方法:
date:getTime($date)
Saxon 和 Xalan 机制并不完全相同,但有很多相似之处。
我正在编写一个 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'
方法是 public 并且没有参数。
对于 Saxon:有关 "reflexive" 调用外部 Java 对象的信息可以在 http://www.saxonica.com/documentation/index.html#!extensibility/functions
找到首先要注意的是它需要 Saxon-PE 或 -EE。
如果是没有参数的实例级(非静态)方法,那么最简单的方法是:
(a)声明class名称对应的命名空间,例如
xmlns:date="java:java.util.Date"
(b) 以外部对象作为第一个参数调用方法:
date:getTime($date)
Saxon 和 Xalan 机制并不完全相同,但有很多相似之处。