XSLT 2.0中的奇怪错误[SXXP0003]

时间:2011-04-19 11:25:43

标签: xslt xslt-2.0 saxon

我在过去一天一直在处理XSLT 2.0,试图解析纯文本文件。 显然我甚至无法进入我实际工作的部分,此刻,xsl不需要做任何事情,只需在saxonb-xslt处理器中正确加载。

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions"  version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:template match='/'>
<add_adverts>
<Body>
<Envelope>
<Advert>
<xsl:for-each select="tokenize(unparsed-text('A2.blm'), '\r?\n')">
 <fff>?</fff>
</xsl:for-each>
</Advert>
</Envelope>
</Body>
</add_adverts>  
</xsl:template>

</xsl:stylesheet>

我如何运行它:

saxonb-xslt -s:A2.blm -xsl:eraxsl.xsl -o:test.xml

blm文件是一个纯文本文件,第一行是:#HEADER#last line is #END#中有一行名为#DATA#,我要解析它直到结束。 每条记录由^。

分隔

谢谢,

2 个答案:

答案 0 :(得分:2)

saxon-xslt的-s:参数指定了我认为必须采用xml格式的源文档。在您的示例中,您不需要此源,因为您在模板中指定了文件名。解决方案是删除源参数并指定命名模板而不是匹配作为起点:

<xsl:template name="main">
    <add_adverts>...<add_adverts>
</xsl:template>


saxonb-xslt -xsl:eraxsl.xsl -o:test.xml -it:main

答案 1 :(得分:1)

我根本没有重复这个问题 - 我在与XSLT样式表相同的目录中创建了“A2.blm”文件。转型按预期进行。

此错误来自XML解析器,而不是来自XSLT处理器。很可能你提供的源XML文件不是格式良好的XML文档(或完全缺失)。

很可能无法找到或访问“A2.blm”文件 - 请检查

为了找到此文件的顺序,它必须与样式表文件位于同一目录中。

来自 XSLT 2.0 W3C spec

“unparsed-text函数读取外部资源(例如,文件)并将其内容作为字符串返回。

$ href参数必须是URI形式的字符串。 URI必须不包含片段标识符,并且必须标识可以作为文本读取的资源。 如果URI是相对URI,则相对于静态上下文中的基本URI 解析它。 “

最重要的是:

注意: 如果适合使用不同的基URI(例如,在解析从源文档中读取的相对URI时),则应在使用resolve-uriFO函数解析相对URI,然后再将其传递给未解析的文本函数

以下是您的转换的其余部分按预期工作的证明:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/02/xpath-functions"  version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match='/'>
        <add_adverts>
            <Body>
                <Envelope>
                    <Advert>
                        <xsl:for-each select="tokenize(., '\r?\n')">
                            <fff>?</fff>
                        </xsl:for-each>
                    </Advert>
                </Envelope>
            </Body>
        </add_adverts>
    </xsl:template>
</xsl:stylesheet>

在此XML文档上应用此转换时

<t>1&#xA;2&#xD;&#xA;3&#xA;</t>

产生了想要的正确结果

<add_adverts xmlns:fn="http://www.w3.org/2005/02/xpath-functions">
   <Body>
      <Envelope>
         <Advert>
            <fff>?</fff>
            <fff>?</fff>
            <fff>?</fff>
            <fff>?</fff>
         </Advert>
      </Envelope>
   </Body>
</add_adverts>