当我尝试在Saxon中使用自定义扩展元素时,我在XSL文件中收到错误XTDE:unknown extension instruction
。我在撒克逊邮件列表上问了这个问题,但还没有收到回复,所以我决定在这里问一下。为了提供帮助,以下是邮件列表中的全部内容:
来自:sky
我刚开始使用Saxon。在浏览了一些文档之后,我仍然发现很难编写自己的自定义扩展指令。我已阅读“编写XSLT扩展指令”,以及net.sf.saxon.option.sql包中提供的示例。但我仍然有点困惑:文件说,SimpleExpression的子类应该实现方法getImplementationMethod()和getExpressionType(),并且取决于getImplementationMethod()返回的值,应该实现evaluateItem(),iterate()或process()方法之一。 / p>
但是,在sql示例中只实现了call()方法。我是XML / XSLT的新手,因此很难理解如何编写自己的扩展元素。 是否有某种类型的教程解释更详细地编写扩展元素?(我有谷歌但没有找到运气,我能找到的最好的是具有不同实现的旧版Saxon版本)。或许我应该首先浏览一些其他XML / XSLT中间件? 提前致谢
来自Michael Kay的
你是对的,实施扩展指令并不容易。这部分是因为API非常复杂,部分原因是文档很差,部分原因是帮助您理解它的代码不是开源的。造成这种情况的根本原因是没有多少人试图这样做,因此几年来反馈很少会导致改善。我鼓励你认真地问自己这是否是你真正想做的事情,以应对困难。
迈克尔凯 Saxonica
您引用的文档摘录似乎已过时。 “可调用”界面是一个相对较新的添加,文档还没有赶上。实现call()方法就足够了。
来自天空
感谢您的回复。
我正在用Saxon取代Xalan,因此有针对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参数将它添加到类路径中。请帮助:)
答案 0 :(得分:0)
因为我在命令行中使用net.sf.saxon.Transform,所以配置类对象在执行Config.class后不再存在。起初我以为config.setExtensionElementNamespace()会在某处写入配置文件。但结果证明是错误的。因此,有两种方法可以设置扩展元素命名空间:
net.sf.saxon.Transform -config:config.xml -s:source.xml -xsl:transform.xsl -o:result.out