我想要实现的是(使用Saxon-B 9.1):
1)使用以下Example类的对象作为参数
运行XSLT转换2)使用具有所选节点的反射扩展功能
填充对象的属性3)运行第二次XSLT转换(在不同的XML输入上)并使用填充值作为参数传递上述对象
4)将XML节点从对象插入到输出文档
我的课程如下:
public class Example {
. private NodeSet test;
. public RequestInfo() {}
. public void settest(NodeList t) {
. this.test = t;
. }
. public NodeList gettest() {
. return test;
. }
}
第一次转换似乎填充了我的对象(在XSLT中使用settest()方法) - 我可以看到正确的节点添加到NodeList。
但是,我在运行第二次转换并从XSLT中调用gettest()方法时遇到错误:
NodeInfo returned by extension function was created with an incompatible Configuration
我在想我是不是应该使用NodeList,但也许是Saxon能够识别的一些不同的等效类型?我尝试使用NodeSet但得到了相同的错误消息。
对此有任何帮助将不胜感激。
答案 0 :(得分:1)
您没有显示足够的信息来确切了解您的错误,但我可以尝试解释错误消息。 Saxon通过将整数代码分配给XML文档和样式表中使用的所有名称,并使用整数比较来比较名称,从而实现其快速性能。保存整数到名称的映射的位置是NamePool,NamePool由Saxon Configuration对象拥有;所以参与转换的所有文档,样式表等都必须在同一个Configuration下创建(这有点像DOM规则,所有Nodes必须在它们所附加的Document下创建)。该消息表示您至少有两个不同的Configuration对象。配置由应用程序显式创建,或者在创建TransformerFactory,XPathFactory或其他此类对象时隐式创建。
我想知道这种XSLT和Java代码的混合是否真的是一个好主意?通常当我看到它时,正在使用Java代码,因为人们还没有掌握如何在XSLT中实现所需的效果。没有将DOM与Saxon一起使用有很多很好的理由:它非常慢,它需要更多的代码行,它不是线程安全的,它更难调试,...