(这是具有默认回退值的源端口的对应物?)
我有一个XProc管道,我希望输出像这样工作:
- 如果使用
-oresult=foo.xml
在命令行上提供URL,则管道的结果被写入该文档; - 如果没有提供URL,则将结果写入
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
。