2016-12-19 13 views
-1

XSLT v2.0では、固定長ファイルをXMLに変換する必要があります。私は他の参考文献を見ましたが、私はXSLTには適用できません。例えば、私はこのようなテキストファイルがある場合:XSLTの固定長のXMLへの変換

UHL1 2016-999999 000000001 DAILY 001                
ITNCC609890989099ITNCC463374755000010000.00 SANTANDER CONSUMERBOA-t-1111111111 Bank of America 2016- 
ITNCC463374755017ITNCC463374755000010000.00      CONTRA   SANTANDER CONSUMER 2016- 
UTL110000.00  10000.00  00000010000001               

をUHLと1行目がヘッダーレコードで、2行目は詳細1レコードで、3行目は詳細2録音され、最後の行は予告編です記録。

私はこのようなXMLファイルを生成する必要があります。

<BACSRecord> 
<Header> 
    <Item1>UHL</Item1> 
    <Item2>1</Item2> 
    <Item3/> 
    <Item4>2016-</Item4> 
    <Item5>999999</Item5> 
    <Item6/> 
    <Item7>00</Item7> 
    <Item8>000000</Item8> 
    <Item9>1 DAILY </Item9> 
    <Item10>001</Item10> 
    <Item11/> 
    <Item12/> 
    <Item13/> 
    <Item14/> 
</Header> 
<Transaction> 
    <Detail1> 
     <Item1>ITNCC6</Item1> 
     <Item2>09890989</Item2> 
     <Item3>0</Item3> 
     <Item4>99</Item4> 
     <Item5>ITNCC4</Item5> 
     <Item6>63374755</Item6> 
     <Item7>0000</Item7> 
     <Item8>10000.00 </Item8> 
     <Item9>SANTANDER CONSUMER</Item9> 
     <Item10>BOA-t-1111111111 </Item10> 
     <Item11>Bank of America </Item11> 
     <Item12> 2016-</Item12> 
    </Detail1> 
    <Detail2> 
     <Item1>ITNCC4</Item1> 
     <Item2>63374755</Item2> 
     <Item3>0</Item3> 
     <Item4>17</Item4> 
     <Item5>ITNCC4</Item5> 
     <Item6>63374755</Item6> 
     <Item7>0000</Item7> 
     <Item8>10000.00 </Item8> 
     <Item9/> 
     <Item10>CONTRA</Item10> 
     <Item11/> 
     <Item12>SANTANDER CONSUMER</Item12> 
     <Item13> 2016-</Item13> 
    </Detail2> 
</Transaction> 
<Trailer> 
    <Item1>UTL</Item1> 
    <Item2>1</Item2> 
    <Item3>10000.00  </Item3> 
    <Item4>10000.00  </Item4> 
    <Item5>0000001</Item5> 
    <Item6>0000001</Item6> 
    <Item7/> 
    <Item8/> 
</Trailer> 

それはXSLTでそれを行うことは可能ですか?

ありがとうございます。

+0

通常XSLTをテキストにXMLを変換するために使用されるだろう、と周りにいない他の方法。ただし、 "unparsed-text"関数を使用してXSLT 2.0でこれを行うことは可能です。 https://www.w3.org/TR/xslt20/#unparsed-textを参照してください。 –

答えて

1

確かに、このような何か:

<xsl:template name="main"> 
<BACSRecord> 
    <xsl:variable name="lines" as="xs:string*" select="tokenize(unparsed-text('data.txt'), '\n')"> 
    <Header> 
    <xsl:sequence select="f:header($lines[1])"/> 
    </Header> 
    <Transaction> 
    <xsl:for-each select="subsequence($lines, 2)"> 
    <xsl:element name="Details{position()}"> 
     <xsl:sequence select="f:details(.)"/> 
    </xsl:element> 
    </Transaction> 
    <Trailer> 
    <xsl:sequence select="f:trailer($lines[last()])"/> 
    </Header> 
</xsl:template> 

<xsl:function name="f:details" as="element(*)"> 
<xsl:param name="line" as="xs:string"/> 
<xsl:sequence select="f:split(., (6,8,1,2,6,8,4,....))"/> 
</xsl:function> 

<xsl:function name="f:split" as="element(*)"> 
    <xsl:param name="line" as="xs:string"/> 
    <xsl:param name="widths as="xs:integer*"/> 
    <xsl:for-each select="1 to count($widths)"> 
    <xsl:element name="Item{.}"> 
    <xsl:value-of select="subtring($line, sum(subsequence($widths, 1, .-1)), $widths[current()]"/> 
    </xsl:element> 
    </xsl:for-each> 
</xsl:function> 
関連する問題