【发布时间】:2014-01-29 03:11:49
【问题描述】:
当我尝试在 Saxon 中使用自定义扩展元素时,在我的 XSL 文件中出现 XTDE:unknown extension instruction 错误。我在撒克逊邮件列表上问过这个问题,但还没有收到回复,所以我决定在这里问。为了提供帮助,以下是邮件列表中的全部内容:
来自:天空
我刚开始使用撒克逊语。在浏览了一些文档之后,我仍然发现很难编写自己的自定义扩展指令。我已阅读“编写 XSLT 扩展指令”以及 net.sf.saxon.option.sql 包中提供的示例。但我还是有点困惑:文件说,SimpleExpression 的子类应该实现方法 getImplementationMethod() 和 getExpressionType(),并且根据 getImplementationMethod() 返回的值,应该实现方法 evaluateItem()、iterate() 或 process() 之一。
但是,在 sql 示例中只实现了 call() 方法。我是 XML/XSLT 的新手,因此很难理解如何编写自己的扩展元素。 是否有某种教程可以更详细地解释编写扩展元素?(我有谷歌但没有找到运气,我能找到的最好的是具有不同实现的旧撒克逊版本)。或者,也许我应该先通过其他一些 XML/XSLT 中间体? 提前致谢
来自迈克尔·凯
你是对的,实现扩展指令并不容易。这部分是因为 API 非常复杂,部分是因为文档很差,部分是因为可以帮助您理解它的代码不是开源的。造成这种情况的根本原因是没有多少人尝试这样做,因此这些年来几乎没有反馈可以导致改进。我会鼓励你认真问问自己,这是否是你真的想要做的足够糟糕的事情来应对困难。
您引用的文档摘录似乎已过时。 “Callable”接口是一个相对较新的添加,文档还没有跟上。实现 call() 方法就足够了。迈克尔·凯 萨克斯尼卡
从天空
感谢您的回复。
我将 Xalan 替换为 Saxon,因此需要重写为 Xalan 编写的扩展指令。我认为如果我将 Xalan 扩展元素重写为 Saxon 扩展函数会更好,但是,我想在做出选择之前尝试一下扩展元素。现在我有扩展元素的问题。我尝试编写一个简单的扩展元素,但无法使用“XTDE 1450:未知扩展指令”运行。这是我的代码的样子:
//Config.java ProfessionalConfiguration config = new ProfessionalConfiguration(); config.setExtensionElementNamespace("degx", "DegElementFactory");
//DegElementFactory.java if(localname.equals("value-of")) return DegxValueOf.class;
//version.xsl <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:degx="http://DegElementFactory" extension-element-prefixes="degx"> ... <degx:value-of select="alpha 1"/> ... </xsl:stylesheet>
我先运行 Config.class,然后运行 sf.net.saxon.Transform,我得到了上面的错误。我的猜测是我以错误的方式配置了扩展元素命名空间。我正确安装了带有评估许可证的 Saxon PE,因为在运行 Transform 后我收到了关于过期天数的消息。
总之,我的工作目录中有 Config.class、DegElementFactory.class、DegxValueOf.class,我通过 -cp 参数将其添加到类路径中。请帮忙:)
【问题讨论】:
-
我从未使用过该功能,但如果您在 XSLT 中有
xmlns:degx="http://DegElementFactory",那么我希望代码使用setExtensionElementNamespace("http://DegElementFactory", "DegElementFactory");。 -
是的,后来我被告知要进行此更改。但仍然得到同样的错误。我想还有额外的问题。我感觉它来自使用专业配置类。我会在尝试配置文件后更新。