当前位置: 首页 > 知识库问答 >
问题:

如何使用Java对象作为参数的XML transformer?

吴丁雷
2023-03-14
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'

该方法是公共的,没有参数。

共有1个答案

仉洲
2023-03-14

对于Saxon:关于外部Java对象的“自反”调用的信息可以在http://www.saxonica.com/documentation/index.html#!extensibility/functions上找到

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

如果它是没有参数的实例级(非静态)方法,那么最简单的方法是:

(a)声明与类名相对应的命名空间,例如

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

(b)调用以外部对象为第一个参数的方法:

date:getTime($date)

Saxon和Xalan机制虽然有很多相似之处,但并不完全相同。

 类似资料:
  • 我已经设置了ModelAndView对象 然后,我在JSP中导入了其他助手 然后我尝试使用文档字段作为如下参数 IDEA告诉我那个文件没有解决 堆栈跟踪 在jsp文件中的[44]行发生错误:[/WEB-INF/view/jsp/admin/document_card.jsp]document.pub_date无法解析为类型41: РћРїСѓР±Р"икование 42: 43:

  • 如何使用变量作为对象中的名称参数? 电流输出: 我想要实现的输出:

  • 我可以让这段代码在没有对象作为抽象方法输入参数的情况下工作。例如,如果我亲自将方法的输入参数设置为,emp就会起作用。 当我将输入参数作为方法的对象时,它抛出了一个错误 emp不是抽象的,并且不会覆盖person类emp extends person{^

  • 我试图使用Volley库向服务器发出一个JSONObject POST请求,该请求包含两个参数,一个对象(地址)和一个不同对象(租户)的列表。 当我尝试发出请求时,第一个参数(地址)在发送之前被截取格式化,服务器不接受该请求。 我的请求如下所示: 我的postPropertyJSONObject是这样创建的: convertAddressToJson()方法如下所示: 我尝试只是传递地址对象,但这

  • 我需要在java Swagger UI中传递一个对象数组作为参数。我无法做到这一点。然而,我可以轻松地将字符串数组作为参数传递。但是不知道如何传递嵌套在另一个类或DTO中的对象数组。我正在使用JavaSpring并开发RESTful Web服务。 下面是我的第一个 DTO,它在我的 REST API 中作为模型属性作为参数传递: 下面是第二个 DTO,其数组在第一个 DTO 中成为属性: 下面是控

  • 当我在输入字段中输入object fields值时,我想从ArrayList中删除一个对象。 我有一个超类,我将添加不同米的一般信息。 然后我有一个时钟类,它扩展了超类,并有更多的值。 然后我有一个archive类,它创建了一个arrayList,其中包含不同的对象,并且当用户收到一个字段的提示时,会有一个删除对象的方法,在该字段中,他们可以将“regNum”作为字符串键入。 然后计划是,它迭代列