如何判断我编写的 XSLT 3.0 是不是实际上是流式传输 XML?

Posted

技术标签:

【中文标题】如何判断我编写的 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? 【发布时间】:2020-05-21 16:48:46 【问题描述】:

正如锡上所说的那样。

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

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

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

【问题讨论】:

【参考方案1】:

如果您请求流式传输(例如<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 或代替键。

【讨论】:

这是很好的信息,谢谢。不幸的是,我使用的是 Notepad++ 而不是 Oxygen,而使用我的 XSLT 的 IDE 似乎没有为他们的 Saxon 解释器公开命令行选项。这是一种令人费解的设置......很高兴知道我应该期望看到一些关于它是否可以流式传输的响应。我敢打赌,如果我挖掘得足够多,我可以在运行时日志中找到它。

以上是关于如何判断我编写的 XSLT 3.0 是不是实际上是流式传输 XML?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 XSLT 3.0 地图问题?

如何在 Java 应用程序中使用 XSLT 3.0?

使用 XSLT 3.0 的 JSON 到 XML - 如何加载 JSON 源并调用 json-to-xml 函数?

如何使用 XSLT 测试图像文件是不是存在?

如何使用 XSLT 3.0 中的 xsl:stream、xsl:accumulator、xs:fork?

如何在 .NET 中使用 Saxon-HE 9.8 使用 XSLT 3.0