2014-09-02 75 views
0

我有由外部提供者發送的xml數據。我們需要將其輸出到固定寬度的文本文件中,以加載到另一個系統中。該數據包括一個全球元素,稱爲Stream,應爲每個Voucher元素輸出。但事實並非如此!xsl不輸出換行到文本輸出並且不重複全局數據

這裏是XML:

<VocaDocument xmlns:cmn="http://www.voca.com/schemas/common" xmlns="http://www.voca.com/schemas/messaging" xmlns:iso="http://www.voca.com/schemas/common/iso" xmlns:env="http://www.voca.com/schemas/envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.voca.com/schemas/messaging http://www.voca.com/schemas/messaging/Voca_AUDDIS_AdviceofDDI_v1.0.xsd"> 
    <Data> 
     <Document> 
      <StreamStart> 
       <Stream> 
      <AgencyBankParameter>234</AgencyBankParameter> 
      <BankName>LLOYDS BANK PLC</BankName> 
      <BankCode>0004</BankCode> 
      <AgencyBankName>BANK OF CYPRUS UK LTD</AgencyBankName> 
      <AgencyBankCode>0234</AgencyBankCode> 
      <StreamCode>01</StreamCode> 
      <VoucherSortCode>SC300037</VoucherSortCode> 
      <VoucherAccountNumber>46990760</VoucherAccountNumber>    
      </Stream> 
      </StreamStart> 
      <DDIVouchers> 
       <Voucher> 
        <TransactionCode>NEW</TransactionCode> 
        <OriginatorIdentification> 
         <ServiceUserNumber>123456</ServiceUserNumber> 
        </OriginatorIdentification> 
       </Voucher>    
       <Voucher> 
        <TransactionCode>OLD</TransactionCode> 
        <OriginatorIdentification> 
         <ServiceUserNumber>789012</ServiceUserNumber> 
        </OriginatorIdentification> 
        <ContactDetails> 
      <PhoneNumber>020 83395862</PhoneNumber> 
      <FaxNumber> FAX</FaxNumber> 
       <Address> 
        <cmn:AddresseeName>RANALD LESLIE</cmn:AddresseeName> 
        <cmn:PostalName>NUFFIELD HEALTH </cmn:PostalName> 
        <cmn:AddressLine>NUFFIELD HOUSE</cmn:AddressLine> 
        <cmn:TownName>SURBITON</cmn:TownName> 
        <cmn:CountyIdentification> </cmn:CountyIdentification> 
        <cmn:CountryName>UNITED KINGDOM</cmn:CountryName> 
        <cmn:ZipCode>KT6 4BN</cmn:ZipCode> 
        </Address> 
     </ContactDetails> 
      <ProcessingDate>2014-08-19</ProcessingDate> 
      <BankAccount><FirstLastVoucherCode>FirstLast</FirstLastVoucherCode><AgencyBankCode>0234</AgencyBankCode><SortCode>SC300037</SortCode><AccountNumber>46990760</AccountNumber><TotalVouchers>1</TotalVouchers></BankAccount> 
       </Voucher> 


      </DDIVouchers> 
     </Document> 
    </Data> 
</VocaDocument> 

我有下面的XSL,我從StackOverflow的幫助下建造的。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="http://www.voca.com/schemas/messaging" 
xmlns:cmn="http://www.voca.com/schemas/common"> 
<xsl:output method="text" encoding="UTF-8" /> 

<xsl:template match="/my:MyRoot"> 
    <xsl:for-each select="VocaDocument/Data/Document/DDIVouchers/Voucher"> 
     <xsl:value-of select="../../StreamStart/Stream/AgencyBankParameter" /> 
     <xsl:value-of select="../../StreamStart/Stream/BankName" /> 

     <xsl:value-of select="ContactDetails/PhoneNumber" /> 
     <xsl:value-of select="ContactDetails/FaxNumber" /> 
     <xsl:value-of select="ContactDetails/Address/cmn:AddresseeName" /> 
     <xsl:value-of select="ContactDetails/Address/cmn:PostalName" /> 
     <xsl:value-of select="ContactDetails/Address/cmn:AddressLine" /> 
     <xsl:value-of select="ContactDetails/Address/cmn:TownName" /> 
     <xsl:value-of select="ContactDetails/Address/cmn:CountyIdentification" /> 
     <xsl:value-of select="ContactDetails/Address/cmn:CountryName" /> 
     <xsl:value-of select="ContactDetails/Address/cmn:ZipCode" /> 
     <xsl:value-of select="ProcessingDate" /> 

     <xsl:value-of select="BankAccount/SortCode" /> 
     <xsl:value-of select="BankAccount/AccountNumber" /> 
     <xsl:value-of select="BankAccount/TotalVouchers" /> 
     <xsl:text>&#xD;&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

我有兩個問題: 1)Stream元素應在輸出的每一行的開始重複,他們還沒有 - 我得到一個在開始時,則只是<Voucher>記錄。該衝突的事情是沒有額外的命名空間聲明作品!

2)我想在我的texty文件中每行結尾處有一個換行/回車輸出,但它不起作用。我試過這個<xsl:text>&#xD;&#xA;</xsl:text>和這個:<xsl:text>&#10;</xsl:text>但都沒有工作。

+1

請寄出可用於重現問題的代碼。你的XML是不完整的,它沒有'MyRoot'元素。 – 2014-09-02 15:11:26

+0

對不起,是的,我從我的其他帖子複製它。看起來很奇怪,你的代碼正確地輸出了兩次'LLOYDS BANK PLC'(Stream)元素,但是我必須做的一個更改已經破壞了它 – 2014-09-02 15:24:35

+0

這個東西似乎與你提供的代碼一樣,它停止工作一次我包含默認名稱空間信息(' xmlns:my =「http://www.voca.com/schemas/messaging」') – 2014-09-02 15:29:32

回答

1

試試這個沿着這樣:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msg="http://www.voca.com/schemas/messaging" 
xmlns:cmn="http://www.voca.com/schemas/common" > 
<xsl:output method="text" encoding="UTF-8" /> 

<xsl:template match="/"> 
    <xsl:for-each select="msg:VocaDocument/msg:Data/msg:Document/msg:DDIVouchers/msg:Voucher"> 
     <xsl:value-of select="../../msg:StreamStart/msg:Stream/msg:AgencyBankParameter" /> 
     <xsl:value-of select="../../msg:StreamStart/msg:Stream/msg:BankName" /> 

     <xsl:value-of select="msg:BankAccount/msg:SortCode" /> 
     <xsl:value-of select="msg:BankAccount/msg:AccountNumber" /> 
     <xsl:value-of select="msg:BankAccount/msg:TotalVouchers" /> 

     <!-- NOTE HOW TO EXTRACT AN ADDRESS ELEMENT THAT HAS ITS OWN NAMESPACE --> 
     <xsl:value-of select="msg:ContactDetails/msg:Address/cmn:AddresseeName" /> 

     <xsl:text>&#xD;&#xA;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

注意,默認情況下,子元素繼承其父的名字空間。

+0

非常感謝您的幫助,耐心並花時間幫助我解決這個問題。 – 2014-09-02 15:58:15