0

我想要实现的是(使用 Saxon-B 9.1):

1) 使用以下示例类的对象作为参数运行 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 但也许是撒克逊人可以识别的一些不同的等效类型?我用 NodeSet 尝试过,但得到了同样的错误信息。

对此的任何帮助将不胜感激。

4

1 回答 1

1

您没有显示足够的信息来确切地了解您做错了什么,但我可以尝试解释错误消息。Saxon 通过将整数代码分配给 XML 文档和样式表中使用的所有名称以及使用整数比较来比较名称来部分实现其快速性能。保存整数到名称的映射的地方是 NamePool,NamePool 归 Saxon Configuration 对象所有;所以参与转换的所有文档、样式表等都必须在相同的配置下创建(这有点像所有节点必须在它们附加到的文档下创建的 DOM 规则)。该消息意味着您周围至少有两个不同的配置对象。配置由您的应用程序显式创建,

我想知道 XSLT 和 Java 代码的这种混合是否真的是一个好主意?通常当我看到它时,正在使用 Java 代码,因为人们还没有掌握如何在 XSLT 中达到预期的效果。不使用 Saxon 的 DOM 有很多很好的理由:它非常慢,需要更多的代码行,它不是线程安全的,更难调试,......

于 2012-10-17T23:16:16.357 回答