我如何判断我编写的 XSLT 3.0 是否真的流式传输 XML?

How can I tell if the XSLT 3.0 that I've writting is actually streaming the XML?

就像罐头上写的那样。

我是 XSLT 3.0 的新手。我很高兴尝试一下,因为我的大部分工作都涉及对巨大的 XML 文件进行相对简单的操作。

我发现 XML 实际上流式传输有几个先决条件,但我都不清楚它们是什么,并且对我编写 XSLT 的能力不太自信(编译器是我的最喜欢的调试工具)。

我如何判断我编写的 XSLT 是否实际上是流式传输 XML 与正常工作但以非流式传输方式?

如果您请求流式传输(使用例如 <xsl:mode streamable="yes"/>)并使用 Saxon 9.8 或 9.9 EE(迄今为止唯一支持 XSLT 3 的那部分的实现),那么它将在期间对您的代码进行流式分析样式表编译并通知您是否使用了它认为不可流式传输的任何构造。

如果您从命令行 运行 Saxon 至少是这样。在 oXygen 内部,我认为您明确需要在 Saxon EE 特定转换场景设置中请求您要使用流式传输(请参阅 https://www.oxygenxml.com/doc/versions/21.1/ug-editor/topics/advanced-saxon-xslt-options-x-publishing2.html?hl=streaming 和 "Enable streaming mode" 选项)。

与大多数 Saxon 配置一样,也可以选择使用配置文件 http://saxonica.com/html/documentation/configuration/configuration-file/

如果您请求在您的代码中进行流式处理并从命令行 运行 Saxon EE,那么如果它认为代码不可流式处理,它将不会执行该代码。

这是一个粗略的概述,有关详细信息,请参阅 http://saxonica.com/html/documentation/sourcedocs/streaming/

此外,一旦你通过流式分析,你可以在命令行上使用-t选项,它会显示哪个解析器用于哪个输入文档以及是否构建树或它使用流处理。

根据我的经验,如果你想使用流式传输,你需要重新学习如何使用 XSLT,如果你是,你可能习惯的许多技术(xsl:call-template,将节点存储在变量中)可能不起作用处理纯流媒体。通常有一种方法可以通过使用 copy-of() and/or snapshot() 将流式处理与传统的基于树的处理混合在一起。还有一些新功能,如累加器,可帮助您的代码流式传输,例如,如果您使用它们代替 xsl:number 或键。