我在.NET中使用Saxon 8.9并想创建一个自定义元素。对于这个(公认的旧版本)撒克逊版本的文档在这个特性上非常模糊,并且似乎暗示它根本不可能或者根本不在.NET中。 任何人都可以提供更深入的了解这是否可能吗?
更新: 在迈克尔的快速更新之后,我再次尝试了这一点。
这会导致错误XTDE1450"未知扩展元素"。 我甚至尝试使用旧的sql扩展java,使用IKVM转换为dll,但它也没有用。
较新版本的文档讨论了在处理器配置中注册命名空间,但setExtensionElementNamespace在此旧版本中不存在。 我受8.9的约束,因为这是我们的产品使用的版本,升级并不真实。
我感谢所有的帮助。
答案 0 :(得分:0)
“自定义元素”我想你的意思是XSLT扩展指令(或扩展元素,取决于您使用的规范版本)。
多年来,如果我没记错的话,这个API的变化并没有多大变化,但是在发布旧版本的新内容时,这似乎很奇怪,更不用说期待帮助了。
我不记得曾经测试过可以在.NET上实现,但理论上它应该是可能的。但是,您需要了解接口是为Java而不是C#设计的。 Saxon on .NET使用的IKVM技术不仅可以从C#调用Java,反之亦然,而且可以实现带有C#实现的Java接口,或者用C#方法覆盖Java方法,甚至可以使用混合代码库上的Visual Studio调试器。所以我不能说这很容易,但我有理由相信它应该是可能的。
答案 1 :(得分: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());