【问题标题】:Saxon, custom extension element, XTDE:unknown extension instructionSaxon,自定义扩展元素,XTDE:未知扩展指令
【发布时间】: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");
  • 是的,后来我被告知要进行此更改。但仍然得到同样的错误。我想还有额外的问题。我感觉它来自使用专业配置类。我会在尝试配置文件后更新。

标签: xslt xslt-1.0 saxon


【解决方案1】:

因为我是从命令行使用net.sf.saxon.Transform,所以配置类对象在执行完Config.class之后就不存在了。起初我以为 config.setExtensionElementNamespace() 会写入某个配置文件。但事实证明这是错误的。所以设置扩展元素命名空间有两种方式:

  1. 从命令行,提供 -config:file 参数。例如

    net.sf.saxon.Transform -config:config.xml -s:source.xml -xsl:transform.xsl -o:result.out

  2. 从应用程序调用 XSLT,实例化配置类并执行 setExtensionElementNamespace() 方法。
@Martin Honnen 还在评论中指出了另一个问题,谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2022-01-16
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    相关资源
    最近更新 更多