我正在尝试将调用Saxon (版本8.9)的批处理文件转换为一个XProc管道(Calabash)。这是我的批次呼叫:
java -jar saxon8.jar -o out.xml in.xml style.xsl +config=config-file.cfg参数配置以这种方式在样式表中定义:
<xsl:param name="config" as="document-node()"/>XProc部分如下所示:
<p:load name="configLoad">
<p:with-option name="href" select="'config-file.cfg'"/>
</p:load>
<p:xslt name="config">
<p:input port="source">
<p:document href="in.xml"/>
</p:input>
<p:input port="parameters">
<p:inline>
<c:param name="config">
<p:pipe port="result" step="configLoad"/>
</c:param>
</p:inline>
</p:input>
<p:input port="stylesheet">
<p:document href="style.xsl"/>
</p:input>
</p:xslt>错误消息如下:
变量$config值的必需项类型是document-node();所提供的值具有项目类型xs:string
我知道<p:exec>步骤,但我不想使用它,因为配置文件将在稍后由其他XSLT转换生成。它还将被其他XProc步骤重用。
是否有可能用正确的参数类型调用XSLT样式表?谢谢你的帮忙!
发布于 2013-07-25 19:16:23
看来您对当前的XProc标准不太满意。它声明参数是名称/值对,其中值的数据类型必须是untypedAtomic的字符串。别问我为什么。
http://www.w3.org/TR/xproc/#parameters
如果您不是动态地组合配置的内容,而只是传递固定文件的内容,您可以只通过一个路径到适当的配置文件,并使用fn:doc()从XSLT文件中读取它。
我建议不要立即编写配置文件。XProc内部的执行顺序可能不像您预期的那样按顺序排列。
另一种方法是将每个配置设置作为单独的参数传递,但是每个设置仍然必须符合平面参数值类型。
哈哈!
发布于 2020-06-06 16:50:51
如果您的config-file.cfg文件是格式良好的XML,并且可以使用XSLT 2,
您可以按照grtjn的建议使用fn:doc(),或者
这允许您从xslt默认集合访问辅助输入文档。
请注意,不需要中间的<p:store>步骤。
此外,如果您不打算在其他步骤中重用已加载的config-file.cfg文档,您甚至不需要在管道中使用<p:load>:您只需在源输入端口中使用<p:document>,如下所示:
<p:input port="source">
<p:document href="in.xml"/>
<p:document href="config-file.cfg"/>
</p:input>我已经在氧气XML中测试过这个,它可以工作。
BTW,这个答案的所有功劳都归于 Martin Honnen,参见: https://stackoverflow.com/a/60436209
https://stackoverflow.com/questions/17861633
复制相似问题