Сопоставление данных плоского файла с одноуровневыми узлами

У меня есть плоский файл, в котором каждая запись является клиентом, и в этой записи есть адреса доставки и счета. Выходная схема имеет запись клиента с дочерним узлом адреса. Я не знаю, как сопоставить 2 адреса из входящей записи с родственными дочерними узлами записи клиента.

У меня есть входной файл, который определяется как:

<customer>
    <customernum/>
    <shipaddrcity/>
    <shipaddrstate/>
    <shipaddrzip/>
    <billaddrcity/>
    <billaddrstate/>
    <billaddrzip/>
</customer>

Вывод должен выглядеть так:

<customer>
    <customernum/>
    <addr>
        <type/>
        <city/>
        <state/>
        <zip/>
    </addr> 
    <addr>
        <type/>
        <city/>
        <state/>
        <zip/>
    </addr>
</customer>

Я новичок в biztalk и не смог найти достойных примеров того, как это сделать с помощью Biztalk Mapper. Я также готов послушать, как это сделать с помощью xslt.


person aintnoprophet    schedule 10.11.2015    source источник
comment
* Я также готов послушать, как это сделать с помощью xslt.* Выполнение этого в XSLT тривиально. Потратьте час на онлайн-учебник, и вы узнаете, как это сделать.   -  person michael.hor257k    schedule 10.11.2015
comment
Что пробовали и каковы результаты? Вот блог, который показывает один пример hestia.typepad.com/flatlander/2007/ 01/mapping_fixed_e.html   -  person Dijkgraaf    schedule 10.11.2015
comment
Спасибо Дийкграаф. Цикл таблицы - это то, что я пытался заставить работать. Мои фактические схемы отображения более сложны, но мне просто нужно было сначала получить несколько примеров более простых схем. На данный момент мне действительно нужно начать с простого, потому что я еще недостаточно знаю Biztalk, чтобы задавать полезные вопросы.   -  person aintnoprophet    schedule 10.11.2015


Ответы (1)


Вы, вероятно, хотите что-то конкретное для BizTalk, а я ничего не знаю о BizTalk, но это может быть полезно для вас в любом случае.

Учитывая исходный документ...

<customers>
<customer>
    <customernum>1</customernum>
    <shipaddrcity>Cairns</shipaddrcity>
    <shipaddrstate>QLD</shipaddrstate>
    <shipaddrzip>b</shipaddrzip>
    <billaddrcity>Sydney</billaddrcity>
    <billaddrstate>NSW</billaddrstate>
    <billaddrzip>c</billaddrzip>
</customer>
<customer>
    <customernum>2</customernum>
    <shipaddrcity>d</shipaddrcity>
    <shipaddrstate>WA</shipaddrstate>
    <shipaddrzip>e</shipaddrzip>
    <billaddrcity>Melbourne</billaddrcity>
    <billaddrstate>Vic</billaddrstate>
    <billaddrzip>f</billaddrzip>
</customer>
</customers>

... эта таблица стилей XSLT 1.0 ...

<xsl:transform
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

<xsl:output omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="customer">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()[not(
      self::shipaddrstate|
      self::shipaddrzip  |
      self::billaddrstate|
      self::billaddrzip   )]"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="shipaddrcity">
  <addr>
    <type>ship</type>
    <city><xsl:value-of select="." /></city>
    <xsl:apply-templates select="../(shipaddrstate|shipaddrzip)" />
  </addr> 
</xsl:template>

<xsl:template match="billaddrcity">
  <addr>
    <type>bill</type>
    <city><xsl:value-of select="." /></city>
    <xsl:apply-templates select="../(billaddrstate|billaddrzip)" />
  </addr> 
</xsl:template>

<xsl:template match="shipaddrstate|billaddrstate">
  <state><xsl:value-of select="." /></state>
</xsl:template>

<xsl:template match="shipaddrzip|billaddrzip">
  <zip><xsl:value-of select="." /></zip>
</xsl:template>

</xsl:transform>

... при применении к входному документу даст ...

<customers>
   <customer>
      <customernum>1</customernum>
      <addr>
         <type>ship</type>
         <city>Cairns</city>
         <state>QLD</state>
         <zip>b</zip>
      </addr>
      <addr>
         <type>bill</type>
         <city>Sydney</city>
         <state>NSW</state>
         <zip>c</zip>
      </addr>
   </customer>
   <customer>
      <customernum>2</customernum>
      <addr>
         <type>ship</type>
         <city>d</city>
         <state>WA</state>
         <zip>e</zip>
      </addr>
      <addr>
         <type>bill</type>
         <city>Melbourne</city>
         <state>Vic</state>
         <zip>f</zip>
      </addr>
   </customer>
</customers>
person Sean B. Durkin    schedule 11.11.2015