【问题标题】:using java to get xsl message使用java获取xsl消息
【发布时间】:2014-12-11 10:28:31
【问题描述】:

我正在尝试使用 JAXP 在 JTextArea 中打印 <xsl:message>。 我的问题是,我无法用我的变压器创建一个 saxonica 控制器,我不知道为什么,因为我正在使用 TransformerFactoryImpl,因为在某些答案中被调用。

这是我的 Java 代码:

public static void xslTransform(File xmlFile,File xslFile, JTextArea output){
StreamSource source = new StreamSource(xmlFile);
StreamResult result = new StreamResult(xslFile);
TransformerFactoryImpl tfimpl = new TransformerFactoryImpl();
Transformer transformer = tfimpl.newInstance().newTransformer(new StreamSource(xslFile));
Controller controller = new Controller(transformer);

为控制器导入:

net.sf.saxon.Controller;

希望有人可以帮助我。

卡夫

【问题讨论】:

  • 第一行缺少“xsl:message”。
  • 我已编辑以解决此问题。为了将来参考,您可以通过将相关位括在反引号中来将文本视为“逐字”,而无需将尖括号解释为 html 标记。
  • 谢谢 =)) 这是我的第一篇文章
  • 去掉.newInstance()是否有效,即只调用tfimpl.newTransformer.newInstance()TransformerFactory 上的静态方法,用于查找 TransformerFactory 的实现并实例化它,您不需要这样做,因为您已经有一个实例。

标签: java xslt saxon


【解决方案1】:

Controller 类上从来没有一个构造函数将 JAXP Transformer 作为参数,我不知道你从哪里得到这个想法。

在 Saxon 9.6 之前的版本中,如果要调用 Controller 对象上的方法,可以将 Transformer 强制转换为 Controller,即

Controller controller = (Controller)transformer;

在 9.6 中,Controller 和 Transformer 之间的关系发生了变化,因为 JAXP API 越来越不适合利用 XSLT 3.0 中提供的功能。您现在可以将 Transformer 转换为 net.sf.saxon.jaxp.TransformerImpl,并从 TransformerImpl 调用 getUnderlyingController() 以访问 Controller。

但是你真的想这样做吗?另一种方法是做

factory.setAttribute(FeatureKeys.MESSAGE_EMITTER_CLASS, MyMessageEmitter.class)

其中 MyMessageEmitter 是您对 Saxon 的 MessageEmitter 接口的实现。

【讨论】:

  • 你能给我看一个可能更简单的方法 factory.setAttribute(...) 的例子吗?最好将消息作为字符串?抱歉,我对 java 和 xslt 没有任何经验...
  • 我得到一个 java.lang.IllegalArgumentException: MESSAGE_EMITTER_CLASS 类必须是行中的字符串 "factory.setAttribute(...);
  • 是的,对不起,它必须是类的名称,而不是实际的类。
  • 非常感谢我明白了 =) 但现在我遇到了下一个问题。如何将这些作为字符串放入 TextArea?
  • 如果是新问题,请在新问题中提出(并使其独立)。
猜你喜欢
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2021-06-09
  • 2020-02-20
  • 2016-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
相关资源
最近更新 更多