计算给定样式表中 xsl:result-文档的所有出现次数

count all occurences of xsl:result-document in a given stylesheet

我的应用程序的一部分存在问题,其中我有一些用于 xslt 转换功能的实用程序 classes。我使用 SaxonHE 作为 XSLT Transformer 实现。

我的助手 class 有一个函数:URL mapFile(URL input, String stylesheetPath)

它将一个 XML-文件的 URL 作为输入,return 为创建的 XML- 文件输入一个 URL。它处理 XSLT 转换的初始化和执行。

但是样式表理论上可以创建多个带有 xsl:result-文档标签的 XML 文件,我希望我的实用程序 class 能够识别给定的样式表是否会这样做并妥善处理。

我的想法是 analyse/parse 我的 Java 代码中的样式表并计算 xsl:result-document.

的所有出现次数

根据 href 属性的值,我还可以知道样式表在哪里创建输出 XML 文件,因为我想 return 指向它们位置的 URL .

所以我更改的实用方法是:List<URL> mapFile(URL input, String stylesheetPath) 和 return 一些 URL,具体取决于给定样式表创建的文件数量。

但我不知道如何在 Java 代码中执行此操作,我所有 google 搜索关于 xsl 样式表中计数元素的结果解释了如何计算 XML 元素来自样式表内部的输入 XML,这不是我想要做的。

编辑:我最终根本没有对样式表进行任何解析。我只是创建一个文件夹,如果有人编写的样式表没有将所有结果文件放在该文件夹中,那么如果他们没有得到该结果文档的 URL 返回,那是他们的错。一个 hacky 解决方案,但它适用于我的用例。

对于单模块样式表非常简单:只需执行 XPath 表达式 count(//xsl:result-document).

对于具有多个模块的样式表,它变得更加复杂,因为您必须遵循 xsl:includexsl:import 引用,更具体地说,您必须检测 include/import 图中的循环所以你不会进入无限循环。

您可以将样式表导出到 SEF 文件并在 SEF 文件上执行 count(//*:resultDoc)。不幸的是,Saxon-EE 会花钱,但手工编写代码也会花钱...

但实际上您要求的是两件不同的事情。首先你说你想知道 xsl:result-document 指令的数量,然后你说你想知道创建了多少个结果文档。这些不是一回事,因为您不知道每条 xsl:result-document 指令的执行频率。

我怀疑您可以通过向 Saxon 注册一个结果文档处理程序并使用它来监视 运行 时间对 xsl:result-document 的调用来解决问题。