java - Saxon XSLT 和 NodeList 作为参数

标签 java xslt saxon

我想要实现的是(使用 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/

相关文章:

java - Error :(32, 27)错误:不兼容的类型:对象不能转换为long

java - JAX-RS 仅运行一个函数一次

java - 高效地将多个大型 xml 文件合并为一个文件

java - 使用 java 进行 XSL 解析

c# - XSLt.transform 给我 ""

java - 在 Java 下的 Saxon 中加载和验证 XML 文件和架构的示例代码

java - Java Eclipse 中的 Serializer() 方法 "constructor serializer() is not defined"

java - OpenNLP find() 方法

java - 如何使用 PBKDF2 在 Java 和 Ruby 中生成相同的安全哈希

xml - XSLT 流与 xsl :iterate correct way