带XProc的XSLT - 所需类型的参数绑定

时间:2013-07-25 15:00:05

标签: xslt parameters pipeline calabash xproc

我正在尝试将调用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样式表? 谢谢你的帮助!

2 个答案:

答案 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()

  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