我正在尝试将调用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样式表? 谢谢你的帮助!
答案 0 :(得分:2)
看起来你对目前的XProc标准感到不满意。它声明参数是名称/值对,其中值的数据类型必须是untypedAtomic的字符串。不要问我为什么..
http://www.w3.org/TR/xproc/#parameters
如果你不是动态地编写配置的内容,而只是传递固定文件的内容,你可以只通过一个路径到相应的配置文件,并使用fn:doc()来读取它来自XSLT文件。
我建议不要动态编写配置文件。 XProc中的执行顺序可能不像您预期的那样顺序。
替代方案是将每个配置设置作为单独的参数传递,但是然后每个设置仍然必须符合平面参数值类型..
HTH!
答案 1 :(得分:0)
证明您的 config-file.cfg 文件是格式正确的XML,并且您可以使用XSLT 2,
您可以按照 grtjn 的建议使用fn:doc()
或
<p:load name="configLoad">
<p:with-option name="href" select="'config-file.cfg'"/>
</p:load>
<p:xslt name="config" version="2.0">
<p:input port="source">
<p:document href="in.xml"/>
<p:pipe port="result" step="configLoad"/>
</p:input>
<p:input port="parameters">
<p:empty/>
</p:input>
<p:input port="stylesheet">
<p:document href="style.xsl"/>
</p:input>
</p:xslt>
<xsl:param name="config" as="document-node()" select="subsequence(collection(), 2)"/>
这使您可以从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>
我已经在Oxygen XML中对此进行了测试,并且可以正常工作。
顺便说一句,此答案的全部功劳归给 Martin Honnen ,请参见此处: https://stackoverflow.com/a/60436209