必须指定源文档或初始模板

时间:2013-05-07 12:59:16

标签: xml xslt-2.0 calabash xproc

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

oXygen编辑器中报告了以下错误:

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

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

  

Mai 07,2013 2:41:52 PM   com.xmlcalabash.util.DefaultXProcMessageListener错误严重:   错误:XD0011:XProc错误错误:XD0011 Mai 07,2013 2:41:52 PM   com.xmlcalabash.drivers.Main错误严重:如果是动态错误   p:document元素引用的资源不存在,   无法访问,或者不是格式良好的XML文档。 Mai 07,2013   2:41:52 PM com.xmlcalabash.drivers.Main error SEVERE:Underlying   exception:net.sf.saxon.s9api.SaxonApiException:重新移植I / O错误   通过XML解析器处理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"/>

1 个答案:

答案 0 :(得分: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步骤没有接收任何输入,甚至没有接收到空文档节点。

我可以在任何p:sink步骤之前添加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>

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

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

HTH!