2012-10-17 35 views
0

我试图实现的是(使用撒克逊-B 9.1):撒克逊XSLT和节点列表作为参数

1)运行XSLT转换用下面的实施例类的对象作为参数

2)对象的属性是从物体使用自反扩展函数与选定节点

3)运行第二XSLT转换(在不同的XML输入填充),并与填充的值传递上述对象作为参数

4)将XML节点到输出做cument

我的类如下:

public class Example { 
. private NodeSet test; 

. public RequestInfo() {} 

. public void settest(NodeList t) { 
.  this.test = t; 
. } 
. public NodeList gettest() { 
.  return test; 
. } 
} 

首先转变似乎来填充我的对象精细(使用XSLT内settest()方法) - 我可以看到添加到节点列表正确的节点。

NodeInfo returned by extension function was created with an incompatible Configuration 

我想我不应该使用节点列表,但也许有些不同,同等类型的,这将是:

然而,从XSLT中运行时第二次转型,并呼吁gettest()方法,我得到以下错误萨克森认可?我用NodeSet试了一下,但得到了同样的错误信息。

任何帮助,将不胜感激。

回答

1

您尚未显示足够的信息以确切地查看您做错了什么,但我可以尝试解释错误消息。撒克逊通过将整数代码分配给XML文档和样式表中使用的所有名称,并使用整数比较来比较名称,从而实现其快速性能。整数映射到名称的地方是NamePool,NamePool由Saxon Configuration对象拥有;因此参与转换的所有文档,样式表等都必须在相同的配置下创建(这有点像DOM规则,所有节点必须在它们所连接的文档下创建)。该消息意味着你至少有两个不同的配置对象。配置是由应用程序显式创建的,或者在创建TransformerFactory,XPathFactory或其他类似对象时隐式创建。

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

+0

我已经创建了不同的TransformerFactory每个转换和这是问题所在。谢谢你,你总是很棒的帮助。 – Zyga

+0

而我想要实现的是将输入XML转换为不同的模式并调用Web服务,然后转换Web服务响应并将其发回。不过,我需要在输出XML中包含来自输​​入XML的XML块(它不包含在web服务调用中)。我不想在XSTL转换之外做任何额外的DOM操作,如果我可以出于性能原因使用XSLT来实现它。不管那是最好/更有效的方式,但我不确定。 – Zyga