我在过去一天一直在处理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#,我要解析它直到结束。 每条记录由^。
分隔谢谢,
答案 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
2
3
</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>