我有一个 XProc 管道,我希望输出像这样工作:
- 如果在命令行中使用 提供了 URL
-oresult=foo.xml
,则管道的结果将写入该文档; - 如果未提供 URL,则应将结果写入
default.xml
.
是否有可能在 XProc 中获得这种行为?
与输入端口默认值的情况不同的是,<p:output>
元素的内容被用作输出端口的默认来源,而不是默认输出。
我有一个 XProc 管道,我希望输出像这样工作:
-oresult=foo.xml
,则管道的结果将写入该文档;default.xml
.是否有可能在 XProc 中获得这种行为?
与输入端口默认值的情况不同的是,<p:output>
元素的内容被用作输出端口的默认来源,而不是默认输出。
我认为标准 XProc 不可能做到这一点。虽然您可以在输入声明上提供默认连接,但输出端口的情况有所不同。简而言之,对于输出声明,没有默认连接(从某种意义上说,您可以从外部覆盖它)。可能令人困惑的是p:output
确实允许在复合步骤的声明中输出连接(并且仅允许复合步骤,而不是原子步骤) - 但这些不充当默认连接。相反,他们会说出现在输出端口上的数据来自哪里(通常是包含步骤的输出端口,但也可以是静态文档或外部文档)。您也不能覆盖这些输出连接,因为那样您可能会更改管道的依赖关系图。
您可以将 XProc 中的“连接”(由p:document
, p:pipe
, p:inline
, p:data
,表示p:empty
)视为从中读取数据的源,而不是写入数据的位置。类似地,一个步骤是一个黑匣子,它从某个地方读取数据并从中倾泻出结果。在此模型中,该步骤并不真正关心其结果会发生什么或它们最终存储在哪里 - 这是与该步骤相关的其他步骤的责任,或者在顶级管道的情况下,XProc 处理器的责任.
如果您确实需要默认输出连接,一种可能的解决方法可能是使用诸如p:store
向顶级管道添加可选选项(您可以覆盖其值)之类的步骤,但我不确定这就是您所追求的。
最后,我使用了接受的答案所建议的选项,并使用了以下代码:
<p:option name="output-url" select="default.xml"/>
<p:store>
<p:with-option name="href" select="$output-url"/>
</p:store>
请注意,我删除了,<p:output>
因为现在输出将由该<p:store>
步骤处理。在我的情况下这没问题,因为这个管道不会与其他管道合并。
而且,不能再使用-oresult=foo.xml
了。相反,必须使用选项output-url=foo.xml
。