2

我正在尝试将调用 Saxon(8.9 版)的批处理文件转换为 XProc 管道(Calabash)。这是我的批处理调用:

java -jar saxon8.jar -o out.xml in.xml style.xsl +config=config-file.cfg

参数 config 在样式表中以这种方式定义:

<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 样式表?谢谢你的帮助!

4

2 回答 2

2

看起来您对当前的 XProc 标准不走运。它指出参数是名称/值对,其中值的数据类型必须是 untypedAtomic 字符串。不要问我为什么。。

http://www.w3.org/TR/xproc/#parameters

如果您不会动态组合配置的内容,而只是传递固定文件的内容,则可以只传递适当配置文件的路径,并使用 fn:doc() 从内部读取它XSLT 文件。

我建议不要即时编写配置文件。XProc 中的执行顺序可能不像您预期​​的那样按顺序排列。

替代方法是将每个配置设置作为单独的参数传递,但是每个设置仍然必须符合平面参数值类型。

于 2013-07-25T19:16:23.673 回答
0

假设您的config-file.cfg文件是格式良好的 XML,并且您可以使用 XSLT 2,
您可以使用grtjnfn:doc()建议的,或者

  1. 以这种方式重写您的 XProc 管道:
    <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>
    
  2. 以这种方式重写样式表的相关部分:
    <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

于 2020-06-06T16:50:51.267 回答