Saxon,自定义扩展元素,XTDE:未知扩展指令

时间:2014-01-29 03:11:50

标签: xslt xslt-1.0 saxon

当我尝试在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非常复杂,部分原因是文档很差,部分原因是帮助您理解它的代码不是开源的。造成这种情况的根本原因是没有多少人试图这样做,因此几年来反馈很少会导致改善。

     

我鼓励你认真地问自己这是否是你真正想做的事情,以应对困难。
  您引用的文档摘录似乎已过时。 “可调用”界面是一个相对较新的添加,文档还没有赶上。实现call()方法就足够了。

     迈克尔凯   Saxonica


  

来自天空

     

感谢您的回复。

     

我正在用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参数将它添加到类路径中。请帮助:)

1 个答案:

答案 0 :(得分:0)

因为我在命令行中使用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.   
  3. 从应用程序调用XSLT,实例配置类并执行setExtensionElementNamespace()方法。
  4.      @Martin Honnen也在评论中指出了另一个问题,谢谢!