2016-12-16 8 views
0

Я ищу другие ссылки, касающиеся преобразования XML-файла в формат Flat File, и я видел многие из них. Я пробовал некоторые из кодов, которые я видел через Интернет, и это очень помогает. Я пытался сделать свой собственный XSLT-файл, и я не могу получить то, что хочу в своем выпуске. Кроме того, мне нужно свести к минимуму мое кодирование в XSLT, так как у меня много кодирования и условия для применения в записи заголовков, деталях/контрафактах и ​​трейлере. Значение записи заголовка правильное, однако 2-я и 3-я строки текущего выхода неверны. Мне нужно заполнить каждую транзакцию, там должны быть 1 деталь и 1 Contra. Результат должен выглядеть так, как ожидалось.Преобразование XML-файла в формат плоского файла

спасибо.

ОБРАЗЦА XML FILE

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

<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 исходит из Payment/TransactionID, и это поле должно содержать только 8 символов. - это твердое значение, а также значение . На следующей строке, то 11111M происходит от компенсации/DebtorParty/FinancialAccount/ID, payment1 находится от платежа/DisplayID и и являются жестко значение. Со следующей строки и в ближайшее время он будет только повторять процесс, и на этот раз значение будет получено из следующего вхождения Payment/Transaction.

Для каждого случая Платежа/Транзакции он создаст 1 детальную запись и 1 запись Contra. В моем примере у меня есть 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

Привет, Майкл, я добавил объяснение выше. Надеюсь, вы понимаете, что я объясняю :). Спасибо. – 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

 Смежные вопросы

  • Нет связанных вопросов^_^