首页 > 解决方案 > 如何判断我编写的 XSLT 3.0 是否实际上是流式传输 XML?

问题描述

就像它在锡上所说的那样。

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

我发现 XML 要真正流式传输有几个必要条件,但我都不清楚它们是什么,而且对我编写 XSLT 的能力也不是非常有信心(编译器是我最喜欢的调试工具)。

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

标签: xmlxslt-3.0

解决方案


如果您请求流式传输(使用 eg <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和“启用流模式”选项)。

与大多数 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()和/或将流式传输与传统的基于树的处理相结合snapshot()。还有一些新功能,如累加器,可以帮助您的代码流式传输,例如,如果您使用它们代替xsl:number或代替键。


推荐阅读