0

我们安装并运行 XSpec 并将其配置为指向我们的样式表,从而导致错误:

[错误] 在评估 xsl:variable 时无法执行 xsl:result-document;SystemID:文件:/Users/a/xspec/ce.xslt;行#:76;Column#: 114 net.sf.saxon.trans.XPathException: 评估 xsl:variable 时无法执行 xsl:result-document

user:wasmachien 发现了一个类似的错误,并且在 xsl:result-document 指令上提出了一个问题,在使用 Calabash 调用样式表时会抛出错误

没有给出错误的解决方案,但它指出:

该错误是由管道中转换步骤之前的 XSpec 测试运行程序引发的(并试图将结果包装在一个变量中!)

如果我们知道如何避免这种行为,我们会得到帮助。

4

3 回答 3

0

XSLT 是一种函数式语言,因此评估变量不应该像创建输出文件那样产生副作用。该错误消息意味着您正试图引起这样的副作用。这将是个坏消息,因为副作用会阻止许多优化,因此 XSLT 规范禁止这样做。

我当然明白为什么这是一个麻烦。如果您有一些正在执行转换的代码,那么您希望能够在变量中捕获代码的结果。但重点是,如果代码有副作用,那么你不能以这种方式封装它:实际上,代码实际上会产生多个结果。

我不知道是否有人致力于使 XSpec 能够使用fn:transform(). 这将是一个理想的解决方案,因为fn:transform允许目标转换使用 生成多个结果xsl:result-document,并且它使用映射捕获所有结果文档。

于 2020-11-20T18:22:47.943 回答
0

最终,这里的问题是 XSpec 试图在一个变量中捕获转换的输出,以便它可以将结果与预期的结果进行比较。xsl:result-document但是由于 Mike 所描述的原因,您不能在变量中包含一个变量。

如果没有 XSpec 重写来避免这种情况,您必须扭曲您的样式表,以便它不会尝试xsl:result-document在正在测试的模板中使用(或在测试它们时)。

在https://github.com/docbook/xslTNG/的测试中,这些方面有一些魔力

于 2020-11-20T18:44:00.737 回答
0

正如其他人所回答的那样,这是当前 XSpec 实现的固有限制。您必须调整样式表以使其可测试。

galtm论文中的“High-Level File Structure to Enable Substitution”和“Case 1: Creating Result Documents”可能会给您一些提示。它基于 Saxon-JS,但它的许多策略适用于 Saxon Java。

于 2020-11-23T10:31:50.647 回答