2016-11-23 195 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调试器。所以我不能说这很容易,但我有理由相信它应该是可能的。