【问题标题】:Saxonica URI ResolverSaxonica URI 解析器
【发布时间】:2021-08-13 23:03:00
【问题描述】:

我们有 xslt 文件,它有多个 xsl:include /document,我正在缓存 XsltExecutable 对象(已编译的 xsl),并且同样用于多个线程的转换。

我的问题是,我们是否需要在编译以及执行转换过程中提供 URIResolver?,编译后的样式表(XsltExecutable 对象)不包括所有相关/依赖的样式表?。 p>

在我的情况下,如果我没有在两个地方都提供 URIResolver,我会收到错误消息。无论如何我们可以保留常见xsls的XsltExecutable并在其他xslt的编译/执行阶段包含它。

注意:我们使用的是saxonica EE

public void transform(XsltExecutable stylesheet,Map<String, String> formatterMap, String sourceXMl, String outFileName) throws SaxonApiException {

       Processor processor = new Processor(true);
       Serializer out = processor.newSerializer(new File(outFileName + ".xml"));
       out.setOutputProperty(Serializer.Property.METHOD, "xml");
       out.setOutputProperty(Serializer.Property.INDENT, "yes");

       Xslt30Transformer trans = stylesheet.load30();
       trans.setURIResolver(new CigURIResolver(formatterMap));
       trans.transform(new StreamSource(new StringReader(sourceXMl)), out);
       System.out.println("Output written to out.xml");

   }

【问题讨论】:

    标签: xslt saxon


    【解决方案1】:

    XsltCompiler 上的 URIResolver 主要用于解析编译时 xsl:includexsl:import 声明。 XsltTransformer 上的 URIResolver 主要用于解析 doc()document() 函数的运行时调用。

    XsltExecutable 代表一个完整的编译样式表。如果您想相互独立地编译样式表的不同部分,并将单独编译的部分以不同的组合链接在一起,那么您需要使用新的 XSLT 3.0 构造 xsl:package 和 @ 将其定义为多个单独的包987654331@(而不是xsl:import/xsl:include)。在 API 级别,已编译的包使用 XsltPackage 对象表示。

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2017-05-18
      • 2016-11-12
      • 2023-01-26
      • 2016-07-11
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多