java - 是否可以在 Saxon 中缓存 XML 文档以避免重新解析和重新索引?

标签 java xml xslt saxon xslt-3.0

我目前正在评估带有 Saxon 的 XSLT3 是否对我们的目的有用。请听我说完。

我们正在开发一个 REST API,它可以根据输入请求 XML 提供凭据。基本上,有 3 个文件在运行:

  • site.xml :
    • 此文件包含代表整个组织的数据:用户、角色、凭据、设置……
    • 它可以轻松包含 10,000 行。
    • 它可以被认为是静态/不可变的。
    • 可以这么说,您可以将其与数据库的 XML 表示形式进行比较。
  • request.xml :
    • 此文件保存提供给 REST API 的请求。
    • 它相当小,通常约为 10 到 50 行。
    • 每个请求都不同。
  • request.xslt :
    • 此文件包含用于转换给定 request.xml 的样式表到输出 XML。
    • 它加载site.xml通过 XSLT document()函数,因为它需要该数据来满足请求。

这里的问题是加载site.xmlrequest.xslt花费很长时间。此外,对于每个请求,XSLT <xsl:key .../> 引入的索引必须重建指令。这加起来。

所以以某种方式缓存是有意义的 site.xml ,以避免必须为每个请求解析和索引该文件。

需要注意的是,多个 API 请求可以同时发生,因此共享此缓存的 site.xml 应该是安全的。多个正在进行的 XSLT 转换之间。

这对于 Saxon (Java) 可能吗?这将如何运作?

更新1

经过一些额外的反射(reflection),我意识到也许我不应该尝试只缓存 site.xml XML 文件,但是request.xslt反而?这假设 site.xml ,加载于 request.xslt通过document() ,是该缓存的一部分。

最佳答案

如果您向我们展示/告诉我们您使用哪个 API 来通过 Saxon 运行 XSLT,将会有所帮助。

至于缓存 XSLT,使用 JAXP 我认为您可以通过使用 TransformerFactoryImpl 中的 newTemplates 创建的 Templates 来实现这一点(http://saxonica.com/html/documentation/using-xsl/embedding/jaxp-transformation.html) ,每次您想要运行 XSLT 时,您都需要使用 newTransformer() 创建一个 Transformer

使用 s9api API,您可以编译一次以获得“不可变的,因此线程安全”的 XsltExecutable (http://saxonica.com/html/documentation/javadoc/net/sf/saxon/s9api/XsltExecutable.html),然后您必须使用 load()load30() 以在每次需要运行代码时创建 XsltTransformerXslt30Transformer

关于共享文档,请参见http://saxonica.com/html/documentation/sourcedocs/preloading.html:

An option is available (Feature.PRE_EVALUATE_DOC_FUNCTION) to indicate that calls to the doc() or document() functions with constant string arguments should be evaluated when a query or stylesheet is compiled, rather than at run-time. This option is intended for use when a reference or lookup document is used by all queries and transformations

但是,有关该配置选项的部分指出:

In XSLT 3.0 a better way of having external documents pre-loaded at stylesheet compile time is to use the new facility of static global variables.

所以在这种情况下你可以声明

<xsl:variable name="site-doc" static="yes" select="doc('site.xml')"/>

您需要等待 Michael Kay 的回复以确定是否足以共享该文档。

关于java - 是否可以在 Saxon 中缓存 XML 文档以避免重新解析和重新索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57904668/

相关文章:

python - 从apache cgi python接收http post请求的xml内容

php - 在 PHP 5 中使用 Schematron 验证 XML

xml - XSLT:检查元素是否较早遍历

xml - 为什么我的 XSLT 样式表没有从我的 XML 文件中提取表的值?

java - Java 的 Desktop.browse 可以提供 HTML Target 以重用浏览器窗口吗?

Java XML Transformer 将 "\n"替换为空格

python - scrapy response.xpath 在具有默认命名空间的 xml 文档上返回空数组,而 response.re 有效

xml - 如果元素不存在,是否可以强制 XSLT 转换失败?

java - JRE 或平台之间的 java.util.Random 实现是否不同?

java - java计算数组中出现的次数