为什么<xsl:template match =“/”>在添加<xsl:result-document>时抛出错误?

时间:2016-08-16 20:33:33

标签: xml xslt-2.0

使用此源XML:

<?xml version='1.0' encoding='UTF-8'?>
<ns:Report_Data xmlns:ns="urn:someURN">
    <ns:Report_Entry>
        <ns:ReportName>SomeReportName</ns:ReportName>
        <ns:ReportComments>Some description for this report....</ns:ReportComments>
        <ns:AreaWhereUsed Descriptor="ThisIsATransform">
            <ns:ID type="GUID">SomeUniqueID</ns:ID>
            <ns:ID type="Component_ID">CUSTOM_COMPONENT</ns:ID>
        </ns:AreaWhereUsed>
        <ns:AreaWhereUsed Descriptor="SomeProcessName">
            <ns:ID type="GUID">SomeDifferentUniqueID</ns:ID>
            <ns:ID type="Process_ID">SomeProcessName</ns:ID>
        </ns:AreaWhereUsed>
        <ns:Area_Where_Used/>
        <ns:Area_Where_Used>
            <ns:AWU_Comment>This is some process description</ns:AWU_Comment>
        </ns:Area_Where_Used>
        <ns:CFs>
            <ns:CF>SomeCF</ns:CF>
        </ns:CFs>
    </ns:Report_Entry>
</ns:Report_Data>

我正在尝试将其转换为一组文本文档。每个&#34;报告条目的一个文件。&#34;

当我使用这个XSL时:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ns="urn:someURN"
    exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:variable name="delimiter" select="'&#x09;'"/>
    <xsl:variable name="quote" select="'&#x22;'"/>
    <xsl:variable name="linefeed" select="'&#xA;'"/>
    <xsl:template match="/">
        <!-- Data Row Begins -->
        <xsl:for-each select="/ns:Report_Data/ns:Report_Entry">

                <xsl:text>Text and various other stuffs</xsl:text>

        </xsl:for-each>
        <!-- Data Row End -->
    </xsl:template>
</xsl:stylesheet>

输出是单行文本,我大多期望。

但是,当我添加result-document标记时,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ns="urn:someURN"
    exclude-result-prefixes="xs" version="2.0">
    <xsl:output method="text" omit-xml-declaration="yes"/>
    <xsl:variable name="delimiter" select="'&#x09;'"/>
    <xsl:variable name="quote" select="'&#x22;'"/>
    <xsl:variable name="linefeed" select="'&#xA;'"/>
    <xsl:template match="/">
        <!-- Data Row Begins -->
        <xsl:for-each select="/ns:Report_Data/ns:Report_Entry">
            <xsl:result-document method="text" href="file_{@ns:ReportName}-output.txt">
                <xsl:text>Text and various other stuffs</xsl:text>
            </xsl:result-document>
        </xsl:for-each>
        <!-- Data Row End -->
    </xsl:template>
</xsl:stylesheet>

我收到错误:Error: Internal error evaluating template rule at line 10 in module引用了模板行:<xsl:template match="/">我正在使用网站http://xslttest.appspot.com/来测试我的转换。

我还是XSL的新手,所以我不太了解模板和apply-template标签的功能。我很感激关于模板标签如何与结果文档标签交互的任何指示。

(注意,我对代码进行了大量清理,但它的运行方式如上所述)。

谢谢!

2 个答案:

答案 0 :(得分:0)

首先,<xsl:for-each select="/Report_Data/Report_Entry">中的xpath中没有使用名称空间前缀,但输入xml有它。所以我怀疑你的转型会产生任何结果 您可以为命名空间urn:(someURN)指定前缀,并且必须对xpath中的元素使用相同的前缀 例如。, xmlns:ns="urn:(someURN)"
<xsl:for-each select="/ns:Report_Data/ns:Report_Entry">

使用xsl:result-document时可能会出现使用网站(外部资源)的问题,因为此指令会指示处理器编写本地文件,这可能是不可能的。
我建议你使用本地处理器并尝试转换。

答案 1 :(得分:0)

消息

  

错误:评估模板规则的内部错误

经常表明萨克森内部的一个内部错误应该报告给Saxonica。但是,它可能是从“回调”方法触发的,例如OutputURIResolver。例如,可以想象实现此在线服务的人将使用OutputURIResolver,在调用xsl:result-document时无条件地抛出异常(尽管有更简洁的方法配置Saxon以达到相同的效果)。

所以我建议,只有你能在自己的环境中重现它并且确切知道Saxon的配置方式,才能向Saxonica报告。