2012-10-17 77 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