2016-11-23 115 views
0

我在.NET中使用Saxon 8.9,並且想要創建自定義元素。這個(不可否認的老版本)撒克遜版本的文檔在這個特性方面非常模糊,似乎表明它不可能或者不在.NET中。 任何人都可以提供任何更多的洞察,這是否可能?Saxon .NET自定義元素

更新: 繼邁克爾的快速更新之後,我再次刺傷了這一點。

  • 我創建它實現ExtensionElementFactory
  • 在我增加了一個伸長元件前綴的樣式表,並與命名空間與隨後CustomElementFactory的全名在斜線一個URI的結局相關聯它CustomElementFactory類
  • 將該元素添加到我的樣式表中。

這會導致錯誤XTDE1450「未知的擴展元素」。 我什至試圖得到舊的SQL擴展java,轉換爲使用IKVM的DLL,但它也沒有工作。

新版本的文檔討論了在處理器配置中註冊名稱空間,但setExtensionElementNamespace在此舊版本中不存在。 我一定會選擇8.9,因爲這是我們產品使用的版本,升級並不是真正可行的。

我很感謝所有的幫助。

+0

我不知道爲什麼這個問題被低估。我希望有一條規則,即人們投票或投票結束,必須留下評論,說明原因。 –

+0

@Phil請提供一些關於您已經嘗試過的細節,並對您遇到的問題進行更具體的說明。 – benPearce

回答

0

這裏缺少的鏈接是如何讓類加載器解析ExtensionElementFactory。

名稱空間聲明中ExtensionElementFactory類的全名需要一個額外的「cli」前綴。例如myBiz.saxon.extensions.customExtensionElementFactory其實本來的命名空間:

xmlns:myBiz="http://myBiz.com/extensions/cli.myBiz.saxon.extensions.customExtensionElementFactory" 

出廠的時候是在你需要確保的類加載器試圖解決這個問題之前,此lib中已經加載不同的引用的庫。這可以使用GC.KeepAlive方法來實現,如下所述:IKVM ClassLoader或通過其他方式調用它。需要注意的是,僅僅將庫作爲參考是不夠的,它需要被「加載」才能解決ClassLoader。

或者,你可以創建一個自定義ClassLoader(實現java.lang。ClassLoader)並用處理器註冊:

processor.Implementation.setClassLoader(new customClassLoader()); 
0

「自定義元素」我猜你的意思是一個XSLT擴展指令(或擴展元素,取決於你使用的是哪個版本的規範)。

如果我記得沒錯的話,API的這個年份並沒有太大的改變,但是對於一個新版本來說新的東西顯得很古怪,更別說期待幫助了。

我不記得曾經測試過可以在.NET上實現,但它理論上應該是可能的。但是,您需要忍受接口是爲Java而不是C#設計的。 Saxon on .NET使用的IKVM技術使得不僅可以從C#中調用Java,反之亦然,而且還可以實現具有C#實現的Java接口,或者使用C#方法重寫Java方法,甚至可以使用混合代碼庫上的Visual Studio調試器。所以我不能說這很容易,但我有理由相信它應該是可能的。