0

过去一天我一直在处理 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# 最后一行是#END# 其中有一行名为#DATA#,我想从中解析到最后。每条记录由 ^ 分隔。

谢谢,

4

2 回答 2

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
于 2011-04-19T13:55:21.340 回答
1

我根本不会重现这个问题——我在 XSLT 样式表所在的目录中创建了“A2.blm”文件。转换按预期工作。

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

很可能找不到或无法访问文件“A2.blm”——检查好

为了找到该文件,它必须位于您的样式表文件所在的同一目录中。

来自XSLT 2.0 W3C 规范

“未解析文本函数读取外部资源(例如文件)并将其内容作为字符串返回。

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

最重要的是:

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

这是一个证明,您的其余转换按预期工作:

<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>
于 2011-04-19T13:14:12.203 回答