1

我正在尝试运行以下涉及管道中 xslt 步骤序列的xproc代码。然而,尽管明确提到了“href”链接,但 Calabash 无法读取或获取源文档。

oXygen编辑器报如下错误:

E [Calabash XProc]“必须指定源文档或初始模板”

从控制台运行葫芦时出现以下错误:

2013 年 7 月 7 日下午 2:41:52 com.xmlcalabash.util.DefaultXProcMessageListener 错误严重:err:XD0011:XProc 错误 err:XD0011 2013 年 7 月 2:41:52 PM com.xmlcalabash.drivers.Main 错误严重:它如果 ap:document 元素引用的资源不存在、无法访问或不是格式良好的 XML 文档,则为动态错误。Mai 07, 2013 2:41:52 PM com.xmlcalabash.drivers.Main 错误严重:基础异常:net.sf.saxon.s9api.SaxonApiException:XML 解析器处理报告的 I/O 错误 C:stlConversionxprocstlxml.xpl:C :stlConversionx procstlxml.xpl (Das System kann die angegebene Datei nicht finden)

有人可以帮我解决这个错误吗?

这是我的 xproc 代码:



<p:output port="result" sequence="true">  
    <p:pipe step="pre-run" port="result"/>
    <p:pipe step="normalize-stl-xml" port="result"/>
    <p:pipe step="tf-transform" port="result"/>
    <p:pipe step="transformARDOnline" port="result"/>
    <p:pipe step="filterUnusedStyleLayout" port="result"/>
</p:output>

<p:xslt name="pre-run">
    <p:input port="source">
        <p:document href="file:/C:/stlConversion/temp/a.xml"/>
    </p:input>
    <p:input port="stylesheet">  
        <p:document href="file:/C:/stlConversion/xslt/test.xsl"/> 
    </p:input>  
    <p:input port="parameters">  
        <p:empty/> 
    </p:input>
</p:xslt>

<p:xslt name="normalize-stl-xml">
    <p:input port="source">  
        <p:pipe step="pre-run" port="result"/>
    </p:input>  
    <p:input port="stylesheet">  
        <p:document href="file:/C:/stlConversion/xslt/normalize_stl_xml.xsl"/> 
    </p:input>  
    <p:input port="parameters">  
        <p:empty/> 
    </p:input>
</p:xslt>

<p:xslt name="tf-transform">
    <p:input port="source">  
        <p:pipe step="normalize-stl-xml" port="result"/>
    </p:input>  
    <p:input port="stylesheet">  
        <p:document href="file:/C:/stlConversion/xslt/tf_test_transform.xsl"/> 
    </p:input>  
    <p:input port="parameters">  
        <p:empty/> 
    </p:input>
</p:xslt>

<p:xslt name="transformARDOnline">
    <p:input port="source">  
        <p:pipe step="tf-transform" port="result"/>
    </p:input>  
    <p:input port="stylesheet">  
        <p:document href="file:/C:/stlConversion/xslt/transformARDOnline.xslt"/> 
    </p:input>  
    <p:input port="parameters">  
        <p:empty/> 
    </p:input>
</p:xslt>

<p:xslt name="filterUnusedStyleLayout">
    <p:input port="source">  
        <p:pipe step="transformARDOnline" port="result"/>
    </p:input>  
    <p:input port="stylesheet">  
        <p:document href="file:/C:/stlConversion/xslt/filterUnusedStyleLayout.xslt"/> 
    </p:input>  
    <p:input port="parameters">  
        <p:empty/> 
    </p:input>
</p:xslt>

<p:store href="file:/C:/stlConversion/ebu-tt_ard_online.xml" media-type="text/xml"/>

4

1 回答 1

0

发生了两种不同的错误消息..

找不到文件。
后者只是表明 Calabash 无法读取 .xpl 文件本身。错误消息提到似乎缺少目录分隔符的文件路径。最初对 Calabash 的调用可能出了点问题。

这是我拼错 .xpl 名称时收到的错误消息:

D:\Projecten\Persoonlijk\XProc\stack8>calabash testt.xpl
mei 07, 2013 8:16:57 PM com.xmlcalabash.util.DefaultXProcMessageListener error
SEVERE: err:XD0011:XProc error err:XD0011
mei 07, 2013 8:16:57 PM com.xmlcalabash.drivers.Main error
SEVERE: It is a dynamic error if the resource referenced by a p:document element does not exist, cannot be accessed, or is not a well-formed XML document.
mei 07, 2013 8:16:57 PM com.xmlcalabash.drivers.Main error
SEVERE: Underlying exception: net.sf.saxon.s9api.SaxonApiException: I/O error reported by XML parser processing file:/D:/Projecten/Persoonlijk/XProc/stack8/test
t.xpl: D:\Projecten\Persoonlijk\XProc\stack8\testt.xpl (The system cannot find the file specified)

必须指定源文档
虽然第一条消息有点误导。听起来您忘记将输入绑定到输入端口,但事实并非如此。它实际上是在告诉您其中一个p:xslt步骤是没有接收到任何输入,甚至没有接收到一个空的文档节点。

我能够通过在任何步骤之前添加 ap:sink和 a来重现错误,如下所示:p:identityp:xslt

<p:declare-step name="main" xmlns:p="http://www.w3.org/ns/xproc"
  xmlns:c="http://www.w3.org/ns/xproc-step" version="1.0">

    <p:input port="source" primary="true" sequence="true">
        <p:document href="temp/a.xml"/>
    </p:input>
    <p:input port="schema" sequence="true"/>
    <p:input port="stylesheet" sequence="true"/>
    <p:input port="parameters" sequence="true" kind="parameter"/>

    <p:output port="result" sequence="true">  
        <p:pipe step="pre-run" port="result"/>
        <p:pipe step="normalize-stl-xml" port="result"/>
        <p:pipe step="tf-transform" port="result"/>
        <p:pipe step="transformARDOnline" port="result"/>
        <p:pipe step="filterUnusedStyleLayout" port="result"/>
    </p:output>

    <p:xslt name="pre-run">
        <p:input port="stylesheet">  
            <p:document href="xslt/test.xsl"/> 
        </p:input>  
    </p:xslt>

    <p:sink/>
    <p:identity>
        <p:input port="source">
            <p:empty/>
        </p:input>
    </p:identity>

    <p:xslt name="normalize-stl-xml">
        <p:input port="stylesheet">  
            <p:document href="xslt/normalize_stl_xml.xsl"/> 
        </p:input>  
    </p:xslt>

    <p:xslt name="tf-transform">
        <p:input port="stylesheet">  
            <p:document href="xslt/tf_test_transform.xsl"/> 
        </p:input>  
    </p:xslt>

    <p:xslt name="transformARDOnline">
        <p:input port="stylesheet">  
            <p:document href="xslt/transformARDOnline.xslt"/> 
        </p:input>  
    </p:xslt>

    <p:xslt name="filterUnusedStyleLayout">
        <p:input port="stylesheet">  
            <p:document href="xslt/filterUnusedStyleLayout.xslt"/> 
        </p:input>  
    </p:xslt>

    <p:store href="ebu-tt_ard_online.xml" media-type="text/xml"/>

</p:declare-step>

正如您在评论中提到的,我还添加了输入声明。我确实将源输入更改为主要输入。主要输入和输出是自动绑定的,因此您可以省略所有输入源声明,如您在上面的代码中所见。类型参数的输入也是如此,它也是自动绑定的。通过将它们排除在外,任何命令行参数都会p:xslt自动传递给。

不是一个确切的答案,但希望它可以帮助您更接近问题。据我所知,没有实际输入和 xslt 的情况下,您的代码在 Calabash 0.9.40 和 1.0.9-94 上运行良好。

于 2013-05-07T18:21:14.233 回答