2011-04-19 30 views
0

私は平日のテキストファイルを解析しようとすると、過去にXSLT 2.0を扱ってきました。 明らかに、私は実際に働く場所に到達することさえできませんでした。現時点では、xslはsaxonb-xsltプロセッサーに正しくロードするために何かをする必要はありません。XSLT 2.0で奇妙なエラーが発生しました[SXXP0003]

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ファイルはプレーンテキストファイル、最初の行である:#ヘッダー#最後の行は#エンド#であり私が最後まで解析したい#DATA#という名前の行。 各レコードは^で区切られています。

おかげで、

+0

テキストファイルをコマンドラインの入力ソースとして渡していますか? –

+0

問題を簡単に再現できる最小限の完全なサンプルを提供することを検討しますか?それはSaxonのどのバージョンですか? –

+0

完全な解決策は私の答えを見てください。問題は、相対URIを正常に解決できないことです。ファイルはXSLTスタイルシートと同じディレクトリになければなりません。または、絶対URIを指定する必要があります。 –

答えて

1

は、私はすべてこの問題をREPROはありません - 私は、XSLTスタイルシートと同じディレクトリに「A2.blm」ファイルを作成しています。変換は期待通りに機能します。

このエラーはXSLTプロセッサからではなく、XMLパーサからのものです。ほとんどの場合、ソースXMLファイルとして、整形式XML文書ではない(または完全に欠落している)ものを提供している可能性があります。

おそらくファイル "A2.blm"が見つからない、またはアクセスされていない可能性があります.-よくチェックしてください。

このファイルを検索するには、スタイルシートファイルと同じディレクトリに存在する必要があります。 XSLT 2.0 W3C specから

:。

「未解析のテキスト機能は、(例えば、ファイル)外部リソースを読み込み、文字列としてその内容を返す

$のhref引数がなければなりませんURIの形式の文字列URIはフラグメント識別子を含まず、テキストとして読み取ることができるリソースを指定する必要がありますURIが相対URIである場合、それはstaticのベースURIを基準にして解決されます文脈。 "

そして、最も重要な:

"注: 異なるベースURIが適切である場合(例えば、相対URIを解決するときは、ソース文書から読み取った)、相対URIはresolve-を使用して解決されるべきですuriFO関数を非解析テキスト関数に渡す前に実行します。「ここ

は、意図したとおりに、あなたの転換の残りの部分が機能することを証明は次のとおりです。

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

指名手配、正しい:この変換は、このXMLドキュメントに適用され

<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> 

結果が生成される

<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> 
+0

もう一度、すばらしい答え。 btw、私の入力ファイル(私はXMLに変換したいもの)はタグを持っていなければならない(あなたの例では ...)、私はXSLTを使って通常のテキストファイルをXMLに変換しますか? – snoofkin

+1

何でも構いません - 私はたいてい ''を使います。または、コマンドラインに初期テンプレート名を指定する(構文をチェックする)ことができます。この場合、ソースXMLファイルをまったく指定しません。 –

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 
+0

+1。ありがとう、私はまたそれを試してみましょう。 – snoofkin

関連する問題