пятница, 1 марта 2013 г.

XSLT маппинг. Copy-of Reference

Преобразование состоит в следующем: в исходном файле идет заголовок с определенным REFERENCE и затем ноды с этим REFERENCE.

<DT_HEADER_01>
<Trailer>01</Trailer>
<Interface>OTVI</Interface>
<FileId>20130215122238</FileId>
<Companycode>TBA</Companycode>
<DocDate>20130124</DocDate>
<Reference>PIP10000200/101</Reference>
<DocHdr>PIP10000200/101</DocHdr>
<Currency>GBP</Currency>
</DT_HEADER_01>


<DT_VNDRLINE_02>
<Reference>PIP10000200/101</Reference>
<Trailer>02</Trailer>
<Interface>OTVI</Interface>
<FileId>20130215122238</FileId>
<Vendor>TBC</Vendor>
<BaseDate>20130215</BaseDate>
<PayTerms>Z001</PayTerms>
<DocAmt>18.90</DocAmt>
<ItemText>PIP10000200/101</ItemText>
</DT_VNDRLINE_02>
<DT_VNDRBNK_03>
<Reference>PIP10000200/101</Reference>
<Trailer>03</Trailer>
<Interface>OTVI</Interface>
<FileId>20130215122238</FileId>
<Name1>Carl Tuesday</Name1>
<Name2></Name2>
<Name3></Name3>
<Language>E</Language>
<PostalCode>LE10 3EY</PostalCode>
<City>Leeds</City>
<CountryKey>GB</CountryKey>
<Street>16 Long street name truncates here!</Street>
<BnkCountryKey>GB</BnkCountryKey>
<Bankno>200178</Bankno>
<Bankacc>13445566</Bankacc>
<BankCntrl></BankCntrl>
<BankRef></BankRef>
</DT_VNDRBNK_03>

Необходимо вложить ноды в хэдер.
выходная структура :

<DT_HEADER_01>                                                       - invoice 1
  <Trailer>01</Trailer>
  <Interface>OTVI</Interface>
  <FileId>20130215122238</FileId>
  <Companycode>TBA</Companycode>
  <DocDate>20130124</DocDate>
  <Reference>PIP10000200/101</Reference>
  <DocHdr>PIP10000200/101</DocHdr>
  <Currency>GBP</Currency>
<DT_VNDRLINE_02>                                             - child 1 with same reference
  <Reference>PIP10000200/101</Reference>
  <Trailer>02</Trailer>
  <Interface>OTVI</Interface>
  <FileId>20130215122238</FileId>
  <Vendor>TBC</Vendor>
  <BaseDate>20130215</BaseDate>
  <PayTerms>Z001</PayTerms>
  <DocAmt>18.90</DocAmt>
  <ItemText>PIP10000200/101</ItemText>
</DT_VNDRLINE_02>
<DT_VNDRBNK_03>                                             - child 1 with same reference
  <Reference>PIP10000200/101</Reference>
  <Trailer>03</Trailer>
  <Interface>OTVI</Interface>
  <FileId>20130215122238</FileId>
  <Name1>Carl Tuesday</Name1>
  <Name2></Name2>
  <Name3></Name3>
  <Language>E</Language>
  <PostalCode>LE10 3EY</PostalCode>
  <City>Leeds</City>
  <CountryKey>GB</CountryKey>
  <Street>16 Long street name truncates here!</Street>
  <BnkCountryKey>GB</BnkCountryKey>
  <Bankno>200178</Bankno>
  <Bankacc>13445566</Bankacc>
  <BankCntrl></BankCntrl>
  <BankRef></BankRef>
</DT_VNDRBNK_03>
</DT_HEADER_01>

Код XSLT:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  <?xml version="1.0" encoding="ISO-8859-1" ?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="XXXXXXXXXXXXXXXXXXXXXXx">
  <xsl:output method="xml" />
<xsl:template match="/">
<ns:MT_FIDCC2_FILE_TO_PI xmlns:ns="XXXXXXXXXXXXXXXXXXXXXXx">
<xsl:copy-of select="//DT_FILEHDR_00"/>
<xsl:apply-templates select="//DT_HEADER_01">
</xsl:apply-templates>
</ns:MT_FIDCC2_FILE_TO_PI>

</xsl:template>

<xsl:template match="DT_HEADER_01">
<DT_HEADER_01>
<xsl:apply-templates/>
<xsl:variable name="ref" >
<xsl:value-of select="./Reference"/>
</xsl:variable>
<xsl:copy-of select="/ns:MT_FIDCC2_FILE_TO_PI/DT_VNDRLINE_02[Reference=$ref]"/>
<xsl:copy-of select="/ns:MT_FIDCC2_FILE_TO_PI/DT_VNDRBNK_03[Reference=$ref]"/>
<xsl:copy-of select="/ns:MT_FIDCC2_FILE_TO_PI/DT_GLLINE_04[Reference=$ref]"/>
</DT_HEADER_01>
</xsl:template>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
 
</xsl:stylesheet>




Комментариев нет:

Отправить комментарий