我正在尝试将调用 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>
错误信息是这样的:
Required item type of value of variable $config is document-node(); supplied value has item type xs:string
我知道<p:exec>
步骤,但我不想使用它,因为配置文件稍后将由其他 XSLT 转换生成。它还应被其他 XProc 步骤重用。
是否可以使用正确的参数类型调用 XSLT 样式表? 感谢您的帮助!
最佳答案
看起来您对当前的 XProc 标准不太走运。它声明参数是名称/值对,其中值的数据类型必须是untypedAtomic 的字符串。别问我为什么..
http://www.w3.org/TR/xproc/#parameters
如果您不会动态编写配置内容,而只是传递固定文件的内容,则可以仅传递相应配置文件的路径,并使用 fn:doc() 来读取它来自 XSLT 文件。
我建议不要即时编写配置文件。 XProc 中的执行顺序可能不像您预期的那样连续。
替代方案是将每个配置设置作为单独的参数传递,但每个设置仍然必须遵守平面参数值类型。
呵呵!
关于XSLT 与 XProc - 所需类型中的参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17861633/