2016-12-16 3 views
0

XMLファイルのフラットファイル形式への変換に関する他の参考文献を探しています。私はインターネット上で見たコードのいくつかを試してみました。私は自分のXSLTファイルを作成しようとしましたが、私が出力したいものを手に入れることはできません。また、ヘッダーレコード、詳細/コントラレコードとトレーラーから多くのコーディングと条件を適用しているので、XSLTでのコーディングを最小限に抑える必要があります。ヘッダーレコードの値は正しいですが、現在の出力の2行目と3行目が正しくありません。私は1つの詳細と1つのコントラクトを持っている必要がありますすべてのトランザクションのために設定する必要があります。出力は、期待される出力のように見えるはずです。XMLファイルをフラットファイル形式に変換する

ありがとうございます。

サンプルXMLファイル

<SyncCreditTransfer xmlns="http://schema.infor.com/InforOAGIS/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" releaseID="9.2" versionID="2.12.3" xsi:schemaLocation="http://schema.infor.com/InforOAGIS/2 http://schema.infor.com/2.12.x/InforOAGIS/BODs/SyncCreditTransfer.xsd"> 
<Application> 
    <Sender> 
     <LogicalID>company department</LogicalID> 
    </Sender> 
    <CreationDateTime>2016-07-01T05:50:16.208Z</CreationDateTime> 
</Application> 
<Data> 
    <Sync> 
     <ID>1122EDF6394</ID> 
     <EntityID>SampleFiele</EntityID> 
    </Sync> 
    <Record> 
     <Header> 
      <DateTime>2016-07-01T05:51:16</DateTime> 
     </Header> 
     <Payment> 
      <DisplayID>Payment1: 09459732</DisplayID> 
      <DebtorParty> 
       <FinancialAccount> 
        <ID>11111</ID> 
       </FinancialAccount> 
      </DebtorParty> 
      <Transaction sequence="1"> 
       <TransactionID>BOA-t-121212</TransactionID> 
       <InstructedAmount currencyID="EUR">123.43</InstructedAmount> 
       <CreditorParty> 
        <FinancialAccount> 
         <ID>AAAAA</ID> 
        </FinancialAccount> 
       </CreditorParty> 
      </Transaction> 
      <Transaction sequence="1"> 
       <TransactionID>BOA-t-343434</TransactionID> 
       <InstructedAmount currencyID="GBP">123.43</InstructedAmount> 
       <CreditorParty> 
        <FinancialAccount> 
         <ID>BBBBB</ID> 
        </FinancialAccount> 
       </CreditorParty> 
      </Transaction> 
     </Payment> 
     <Payment> 
      <DisplayID>Payment2: 12435435</DisplayID> 
      <DebtorParty> 
       <FinancialAccount> 
        <ID>22222</ID> 
       </FinancialAccount> 
      </DebtorParty> 
      <Transaction sequence="1"> 
       <TransactionID>BOA-t-090909</TransactionID> 
       <InstructedAmount currencyID="EUR">123.43</InstructedAmount> 
       <CreditorParty> 
        <FinancialAccount> 
         <ID>AAAAA</ID> 
        </FinancialAccount> 
       </CreditorParty> 
      </Transaction> 
      <Transaction sequence="1"> 
       <TransactionID>BOA-t-878787</TransactionID> 
       <InstructedAmount currencyID="GBP">123.43</InstructedAmount> 
       <CreditorParty> 
        <FinancialAccount> 
         <ID>BBBBB</ID> 
        </FinancialAccount> 
       </CreditorParty> 
      </Transaction> 
     </Payment> 
    </Record> 
</Data> 

XSLTファイル

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:func="myfunc"> 
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:function name="func:trunc"> 
    <xsl:param name="str"/> 
    <xsl:param name="len"/> 
    <xsl:value-of select="substring($str,1,$len)"/> 
</xsl:function> 
<xsl:template match="/"> 
    <!-- Start of Header Record --> 
    <xsl:element name="UserHeadLabel"> 
     <xsl:text>UHL</xsl:text> 
    </xsl:element> 
    <xsl:element name="Constant01"> 
     <xsl:text>1</xsl:text> 
    </xsl:element> 
    <xsl:element name="Filler01"> 
     <xsl:text> </xsl:text> 
    </xsl:element> 
    <xsl:element name="PaymentDate"> 
     <xsl:if test="//*:Header/*:DateTime[normalize-space()]!=''"> 
      <xsl:value-of select="func:trunc(//*:Header/*:DateTime,5)"/> 
     </xsl:if> 
    </xsl:element> 
    <xsl:element name="Constant02"> 
     <xsl:text>999999</xsl:text> 
    </xsl:element> 
    <xsl:element name="Filler02"> 
     <xsl:text> </xsl:text> 
    </xsl:element> 
    <xsl:element name="CurrencyCode"> 
     <xsl:choose> 
      <xsl:when test="//*:Payment/*:Transaction/*:InstructedAmount/@currencyID[normalize-space()]!='' and //*:Payment/*:Transaction/*:InstructedAmount/@currencyID='EUR'"> 
       <xsl:text>01</xsl:text> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:text>00</xsl:text> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:element> 
    <xsl:element name="Constant03"> 
     <xsl:text>000000</xsl:text> 
    </xsl:element> 
    <xsl:element name="Constant04"> 
     <xsl:text>1 DAILY </xsl:text> 
    </xsl:element> 
    <xsl:element name="FileNumber"> 
     <xsl:text>001</xsl:text> 
    </xsl:element> 
    <xsl:element name="Filler03"> 
     <xsl:text> </xsl:text> 
    </xsl:element> 
    <xsl:element name="Optional01"> 
     <xsl:text>  </xsl:text> 
    </xsl:element> 
    <xsl:element name="Optional02"> 
     <xsl:text> </xsl:text> 
    </xsl:element> 
    <xsl:element name="UserOptional"> 
     <xsl:text>000000000000</xsl:text> 
    </xsl:element> 
    <xsl:text>&#xa;</xsl:text> 
    <!-- End of Header Record --> 

    <!-- Start of Detail Record --> 
     <xsl:element name="DestinationSortCodeNo"> 
      <xsl:if test="//*:Payment/*:Transaction/*:CreditorParty/*:FinancialAccount/*:ID[normalize-space()]!=''"> 
       <xsl:value-of select="//*:Payment/*:Transaction/*:CreditorParty/*:FinancialAccount/*:ID"/> 
      </xsl:if> 
     </xsl:element> 
     <xsl:element name="DestinationAccountNo"> 
      <xsl:if test="//*:Payment/*:Transaction/*:TransactionID[normalize-space()]!=''"> 
       <xsl:value-of select="//*:Payment/*:Transaction/*:TransactionID"/> 
      </xsl:if> 
     </xsl:element> 
    <xsl:element name="Zero01"> 
     <xsl:text>0</xsl:text> 
    </xsl:element> 
    <xsl:element name="TransactionCode"> 
     <xsl:text>99</xsl:text> 
    </xsl:element> 
    <xsl:text>&#xa;</xsl:text> 
    <!-- End of Detail Record --> 

    <!-- Start of Contra Record --> 
     <xsl:element name="UserSortCodeNo1"> 
      <xsl:if test="//*:Payment/*:DebtorParty/*:FinancialAccount/*:ID[normalize-space()]!=''"> 
       <xsl:value-of select="//*:Payment/*:DebtorParty/*:FinancialAccount/*:ID"/> 
      </xsl:if> 
     </xsl:element> 
     <xsl:element name="UserAccountNo1"> 
      <xsl:if test="//*:Payment/*:DisplayID[normalize-space()]!=''"> 
       <xsl:value-of select="//*:Payment/*:DisplayID"/> 
      </xsl:if> 
     </xsl:element> 
    <xsl:element name="Zero01"> 
     <xsl:text>0</xsl:text> 
    </xsl:element> 
    <xsl:element name="TransactionCode"> 
     <xsl:text>17</xsl:text> 
    </xsl:element> 
    <xsl:text>&#xa;</xsl:text> 
    <!-- End of Contra Record --> 
</xsl:template> 

CURRENT OUTPUT

UHL1 2016-999999 010000001 DAILY 001    000000000000 
AAAAA BBBBB CCCCC DDDDDBOA-t-121212 BOA-t-343434 BOA-t-090909 BOA-t-878787099 
11111 22222Payment1: 09459732 Payment2: 12435435017 

期待される出力

UHL1 2016-999999 010000001 DAILY 001    000000000000 
AAAAAABOA-t-12099 
11111MPayment1017 
BBBBBMBOA-t-34099 
11111MPayment1017 
CCCCCMBOA-t-09099 
22222MPayment2017 
DDDDDMBOA-t-87099 
22222MPayment2017 

説明:AAAAAA支払い/トランザクション/ CreditorParty/FinancialAccount/IDから来て、わずか6つの文字を持っている必要があります。 BOA-t-12は、お支払い/取引/トランザクションIDから来ており、このフィールドは8文字のみである必要があります。 は、ハードコードされた値で、値はです。次の行で、11111M支払い/ DebtorParty/FinancialAccount/IDから来て、Payment1は/ DisplayID支払いととからであるハードコードされた値です。次の行からすぐに、それはプロセスを繰り返すに過ぎず、今回は値が次のPayment/Transactionの出現から取得されます。

支払い/トランザクションが発生するたびに、1つの詳細レコードと1つのコントラレコードが作成されます。私の例では、私は4トランザクションがあり、出力は以下のようになります。

Detail - 1st occurrence of Transaction 
Contra - 1st occurrence of Transaction 
Detail - 2nd occurrence 
Contra - 2nd occurrence 
Detail - 3rd occurrence 
Contra - 3rd occurrence 
Detail - 4th occurrence 
Contra - 4th occurrence 

これは固定長形式です。

+1

必要な変換のロジックを説明してください。あなたの入力には 'BOA-t-12099'と' MPayment1017'がありますか? –

+0

こんにちはMichael、私は上記の説明を追加しました。あなたが私が何を説明しているのか理解したいと思っています:)ありがとうございました。 – hannah

答えて

0

はあなたの出発点としてこれを試してみてください:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xpath-default-namespace="http://schema.infor.com/InforOAGIS/2"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:template match="/SyncCreditTransfer"> 
    <!-- Start of Header Record --> 
     <!-- skipped for the purpose of this example --> 
    <!-- End of Header Record --> 
    <!-- Records --> 
    <xsl:for-each select="Data/Record/Payment/Transaction"> 
     <!-- Start of Detail Record --> 
     <xsl:value-of select="substring(CreditorParty/FinancialAccount/ID, 1 , 6)"/> 
     <xsl:value-of select="substring(TransactionID, 1 , 8)"/> 
     <xsl:text>099&#10;</xsl:text> 
     <!-- End of Detail Record --> 
     <!-- Start of Contra Record --> 
     <xsl:value-of select="../DebtorParty/FinancialAccount/ID"/> 
     <xsl:value-of select="../DisplayID"/> 
     <xsl:text>017&#10;</xsl:text> 
     <!-- End of Contra Record --> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

これはまだ「コントラ」のレコードに多くの作業が必要ですが、あなたはその部分を説明していません。

注:

  • あなたの入力で使用される名前空間を処理するためxpath-default-namespaceの使用;

  • xsl:for-eachを使用すると、トランザクションごとにレコードを作成できます。出力方法はxsl:elementは意味をなさない使用して、テキストであることを

も注意してください。

+0

こんにちは、ありがとうございます。 – hannah

関連する問題