如何用ant执行XSLT 2.0?

pau*_*reg 8 ant xslt saxon

我正在尝试从ant文件运行XSLT转换.

我正在使用带有saxon 9解析器的XSLT 2.0样式表(支持XSLT 2.0).

问题是,似乎ant始终调用XSLT 1.0解析器.

这是我的蚂蚁文件:

<xslt style="stylesheet.xslt"
   basedir="core/"    
   extension=".xml"
   destdir="core/"
   classpath="D:\\DevTools\\saxon\\bin\\saxon9.jar">
</xslt>
Run Code Online (Sandbox Code Playgroud)

如果我直接调用它(没有蚂蚁),它就可以了.

任何的想法 ?

jel*_*irt 19

问题是,当Saxon被添加到类路径时,默认的JAXP机制来确定使用哪个TransformerFactory,它将使用默认的Xalan.你要么需要:

  • javax.xml.transform.TransformerFactory系统变量设置为net.sf.saxon.TransformerFactoryImpl,
  • 将saxon9.jar添加到CLASSPATH系统变量,或
  • <factory name="net.sf.saxon.TransformerFactoryImpl"/>xslt元素内使用


Hoy*_*len 6

如果你有这个问题,请检查你是不是使用Ant 1.8.1,因为有一个错误在蚂蚁1.8.1是防止这种工作.(虽然这不是原帖中的问题,因为那是在Ant 1.8.1发布之前).

你的选择是:

  1. 使用没有bug的Ant版本(例如Ant 1.7.1).
  2. CLASSPATH开始之前在to Ant中明确指定saxon9.jar ,方法是:
    • 设置系统CLASSPATH环境变量,或
    • 使用-lib命令行选项ant
  3. 使用SAXON Ant定义您自己的任务(如此线程上的另一个答案所述).
  4. 通过添加processor="org.apache.tools.ant.taskdefs.optional.TraXLiaison"作为xslt任务元素的属性来解决此问题.

我建议使用选项1,然后选项4.

选项2将起作用,但它将责任放在运行ant的人身上,以设置他们的环境并正确运行ant.我假设你不想这样,这就是为什么你试图让任务的classpath属性xslt工作.

选项3具有限制,因为SAXON Ant需要下载和安装其JAR文件.此外,SAXON Ant不适用于SAXON 9.2或更高版本(并且自2008年6月创建以来,SAXON Ant尚未更新).

理论上,指定factory子元素会使您想要显式使用的XSLT处理器 - 防止类加载器在其搜索中更早地找到不同的XSLT处理器,并使用它而不是在CLASSPATH中进一步向下的XSLT处理器.实际上(至少在ant 1.7.0,1.7.1和1.8.0中)如果factory指定了子元素,则xslt任务会忽略该classpath属性 - 这意味着您必须使用显式指定CLASSPATH(选项2).所以它无助于解决原始问题.但是,这似乎已在Ant源代码中修复,因此可以在1.8.1之后的版本中使用.