2017-02-13 6 views
0

xsltを使用してテキストファイルをxmlに変換することは可能ですか?私はxmlから先にやったテキストにすることができることを知っています。 (以下、私がXMLとして解析する必要があるテキストファイルがある)xsltを使用したテキストへのテキスト

C0707:00addd  abcde 
C0707:00tdef  ghidd 
C0715:00abcd  fghi 

XML:しかし、私たちは、XSLT

を使用してXMLとして構成する必要のあるテキストファイルは、この可能

UPDATEです持っています:

<b1> 
<time>0707</time> 
<text>addd</text> 
<text2>abcde</text2> 
<text>tdef</text> 
<text2>ghid</text2> 
</b1> 

<b1> 
<time>0715</time> 
<text>abcd</text> 
<text2>fghi</text2> 
</b1> 
+0

私はこの質問で混乱しています、ASCIIは単なる文字セットです、XMLは通常、ASCII文字セットをとにかく使っています.... – SaggingRufus

+0

あなたは言ったようにそれはできません。 – user726720

+0

xmlとして構造化する必要のあるasciテキストファイルがありましたので、スクリプト化の代わりにxsltを使用する方法があると思いました – user726720

答えて

3

xsl:unparsed-textを使用した1つの例です。

あなたはそれぞれのアイテムがどのように分割されているのかを説明していないので、私は「固定フィールド」タイプのフォーマットを使いました。これは簡単に変更することができますが、開始するにはokの例にする必要があります。

テキスト入力(so.txt)

C0707:00addd  abcde 
C0707:00tdef  ghidd 
C0715:00abcd  fghi 

XSLT 2.0(初期テンプレートはtext2xmlに設定する必要があります)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="txt-encoding" as="xs:string" select="'iso-8859-1'"/> 
    <xsl:param name="txt-uri" as="xs:string" 
    select="'file:///C:/Some/path/so.txt'"/> 

    <xsl:template match="/" name="text2xml"> 
    <xsl:variable name="txt" select="unparsed-text($txt-uri, $txt-encoding)"/> 
    <xsl:variable name="entries" as="node()*"> 
     <xsl:analyze-string select="$txt" regex="\r\n?|\n"> 
     <xsl:non-matching-substring> 
      <xsl:analyze-string select="." regex="^C(.{{4}}):00(.{{9}})(.*)"> 
      <xsl:matching-substring> 
       <entry> 
       <time><xsl:value-of select="regex-group(1)"/></time> 
       <text><xsl:value-of select="normalize-space(regex-group(2))"/></text> 
       <text2><xsl:value-of select="normalize-space(regex-group(3))"/></text2> 
       </entry> 
      </xsl:matching-substring> 
      </xsl:analyze-string> 
     </xsl:non-matching-substring> 
     </xsl:analyze-string>  
    </xsl:variable> 
    <results> 
     <xsl:for-each-group select="$entries" group-by="time"> 
     <b1> 
      <xsl:copy-of 
      select="current-group()[1]/time,current-group()/*[not(self::time)]"/> 
     </b1> 
     </xsl:for-each-group>  
    </results> 
    </xsl:template> 

</xsl:stylesheet> 

出力

<results> 
    <b1> 
     <time>0707</time> 
     <text>addd</text> 
     <text2>abcde</text2> 
     <text>tdef</text> 
     <text2>ghidd</text2> 
    </b1> 
    <b1> 
     <time>0715</time> 
     <text>abcd</text> 
     <text2>fghi</text2> 
    </b1> 
</results> 
+0

私はVisual Studioでコードを理解するためにあなたの例を実行しているとき、私はこのエラーが表示されます:ルートレベルのデータが無効です。 1行目、1位。何か手がかりがありますか? – user726720

+0

@ user726720 - XSLTとのエラーですか?あなたがXSLTへの入力としてテキストファイルを使用しようとしているように思えますが、これは動作しません。 (そのため、最初のテンプレートを指定する必要があります;実際の入力はありません)また、Visual Studioでどのプロセッサを使用していますか?あなたは2.0プロセッサが必要になります。 –

+0

申し訳ありません。あなたはそれのためのエディタを提案できますか?おそらくVisual Studioは1.0のみをサポートしているようだ。 – user726720

0

はい、任意のテキストファイルをXMLファイルに変換することは可能です。 XSLT 2.0以降のプロセッサが必要です。

XSLTパーサーで使用できるunparsed-text関数を使用する必要があります。これにより、本質的に文字列の結果であるファイルを読み込むことができます。そこから、文字列を解析するためのいくつかのオプションがあります。

この質問は、HL7テキストファイルをXML:Converting and HL7 segment to XMLに変換することを示しています。この例では、文字で区切られたテキストファイルをXMLファイルに変換し、tokenize()を使用して大雑把な解析を行います。

これは、tokenize()を使用して行や段落を分割する、正規表現を使用して文字列を分割するなど、さまざまなバリエーションを使用しています。一般的には、一般的なテキスト解析時間がシェルスクリプトよりも遅いため、解析に時間がかかります。テキストファイルをXSLTがより美味しく見えるものにする前処理を検討するかもしれません。

+1

'unparsed-text()'にはXSLT 2.0が必要です。 –

+1

リンクされた質問は、テキストをXMLに変換することとは関係ありません。 –

+0

xmlにテキストを解析する方法はありますか?私はサンプルテキストファイルを与えるために私の質問を編集しました – user726720

関連する問題