我想要实现的是(使用 Saxon-B 9.1):
1) 使用以下示例类的对象作为参数运行 XSLT 转换
2) 使用自反扩展函数和选定的节点填充对象的属性
3) 运行第二个 XSLT 转换(在不同的 XML 输入上)并将填充值作为参数传递上述对象
4) 将对象中的 XML 节点插入到输出文档
我的类(class)如下:
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 但收到相同的错误消息。
对此的任何帮助将不胜感激。
最佳答案
您没有显示足够的信息来准确了解您做错了什么,但我可以尝试解释错误消息。 Saxon 实现快速性能的部分原因是为 XML 文档和样式表中使用的所有名称分配整数代码,并使用整数比较来比较名称。保存整数到名称映射的地方是NamePool,NamePool由Saxon Configuration对象拥有;因此参与转换的所有文档、样式表等都必须在同一配置下创建(这有点像 DOM 规则,所有节点必须在它们所附加的文档下创建)。该消息意味着您至少有两个不同的配置对象。配置要么由您的应用程序显式创建,要么在您创建 TransformerFactory、XPathFactory 或其他此类对象时隐式创建。
我想知道 XSLT 和 Java 代码的混合是否真的是一个好主意?经常看到都是用Java代码,因为人们还没有掌握如何在XSLT中达到想要的效果。不将 DOM 与 Saxon 一起使用有很多充分的理由:它非常慢、需要更多行代码、它不是线程安全的、更难调试,...
关于java - Saxon XSLT 和 NodeList 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12934566/