我目前正在评估带有 Saxon 的 XSLT3 是否对我们的目的有用。请听我说完。
我们正在开发一个 REST API,它可以根据输入请求 XML 提供凭据。基本上,有 3 个文件在运行:
-
site.xml
:- 此文件包含代表整个组织的数据:用户、角色、凭据、设置……
- 它可以轻松包含 10,000 行。
- 它可以被认为是静态/不可变的。
- 可以这么说,您可以将其与数据库的 XML 表示形式进行比较。
-
request.xml
:- 此文件保存提供给 REST API 的请求。
- 它相当小,通常约为 10 到 50 行。
- 每个请求都不同。
-
request.xslt
:- 此文件包含用于转换给定
request.xml
的样式表到输出 XML。 - 它加载
site.xml
通过 XSLTdocument()
函数,因为它需要该数据来满足请求。
- 此文件包含用于转换给定
这里的问题是加载site.xml
在request.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()
以在每次需要运行代码时创建 XsltTransformer
或 Xslt30Transformer
。
关于共享文档,请参见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/