2017-09-18 4 views
1

Je suis nouvelle dans BizTalk et je dois créer un XSD-schéma à partir d'un fichier CSV:Comment créer un fichier XSD-schema plat pour des données hiérarchiques à deux niveaux?

CSV-file

Comme vous pouvez le voir, il comprend en-tête et les commandes. Chaque commande a son propre ordre-en-tête - rangée avec le nom de la boutique et rempli Period champ, mais avec vide Quantity, Price, Cost et Currency domaines. Chaque commande a peu de positions, qui ont rempli tous les champs, sauf Period. Chaque en-tête de commande a ItemNumber = 0. Comment créer un schéma de fichier plat correct dans cette situation?

OrderDate;OrderNumber;ItemNumber;DESCRIPTION_LONG;Quantity;Price;Cost;Period;Currency 
30-04-17;9;0;Shop: McDonalds;;;;2017-04; 
30-04-17;9;1;Double burger;2;5,99;11,98;;USD 
30-04-17;9;2;Coca-Cola;2;2,19;4,38;;USD 
30-04-17;10;0;Shop: Hunting and fishing;;;;2017-04; 
30-04-17;10;1;Fishing rod;2;10,90;21,80;;USD 
30-04-17;10;2;Bait;5;1,00;5,00;;USD 
30-04-17;10;3;Hunting gun;1;999,00;999,00;;USD 

Répondre

1

Vous pourriez être en mesure de le faire Identifiers tag à l'aide (voir https://blogs.msdn.microsoft.com/biztalknotes/2013/02/05/flat-file-schema-creation-with-tag-identifiers-in-the-input-flat-file-repeating-in-a-random-fashion/ pour un exemple), mais je ne suis pas 100% sûr que cela fonctionnerait sans problème, étant donné que l'identifiant (ItemNumber = 0) n'est pas le début de la ligne. Mon expérience me montre que le démontage de fichier plat sondant a un succès limité dans ces cas.

Ma recommandation générale aux personnes dans ce cas serait de ne pas essayer de forcer la structure dans votre schéma de fichier plat, puisque votre structure de fichier plat ne l'a évidemment pas. Ce que je vois, c'est que chaque ligne a la même structure/format. Ce n'est que fonctionnellement différent. De ce point de vue, j'opterais pour un schéma de fichier plat correspondant à votre structure de fichier CSV (un type d'enregistrement avec des champs séparés par des virgules et avec un retour à la ligne comme délimiteur de ligne) et, de là, mapper vers un schéma fait plus de sens fonctionnellement.

+0

En fait, cela pourrait fonctionner, car les lignes des éléments ont rempli le champ ** Devise **, les lignes des en-têtes - n'ont pas. Lorsque je crée un schéma de fichier plat, BizTalk pense que ces lignes ont un nombre différent de champs. Mais le problème est que mon fichier plat a un en-tête, ce qui vous gêne l'algorytm de la création de Schema. Comment puis-je supprimer la première ligne de mon fichier avant le début de la conversion du pipeline? Ou comment puis-je spécifier un schéma pour ignorer cette première ligne? – Vitaliy

+0

Oh, non. "Les différents champs comptent" ne fonctionne que pendant la création du schéma. Dans le travail il montre le résultat correct (nombre de champs identique) – Vitaliy

3

Je pense que la meilleure option est d'analyser votre fichier plat en XML sans essayer de 'forcer' la structure finale, comme Pieter l'a dit avant la réponse. Quelque chose comme ceci:

<Root xmlns="http://BizTalkMassCopy.FlatFileSchema3"> 
    <Header xmlns=""> 
    <HeaderOrderDate>OrderDate</HeaderOrderDate> 
    <HeaderOrderNumber>OrderNumber</HeaderOrderNumber> 
    <HeaderItemNumber>ItemNumber</HeaderItemNumber> 
    <HeaderDescription>DESCRIPTION_LONG</HeaderDescription> 
    <HeaderQuantity>Quantity</HeaderQuantity> 
    <HeaderPrice>Price</HeaderPrice> 
    <HeaderCost>Cost</HeaderCost> 
    <HeaderPeriod>Period</HeaderPeriod> 
    <HeaderCurrency>Currency</HeaderCurrency> 
    </Header> 
    <OrderItem xmlns=""> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>9</OrderNumber> 
    <ItemNumber>0</ItemNumber> 
    <Description>Shop: McDonalds</Description> 
    <Quantity></Quantity> 
    <Price></Price> 
    <Cost></Cost> 
    <Period>2017-04</Period> 
    <Currency></Currency> 
    </OrderItem> 
    <OrderItem xmlns=""> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>9</OrderNumber> 
    <ItemNumber>1</ItemNumber> 
    <Description>Double burger</Description> 
    <Quantity>2</Quantity> 
    <Price>5,99</Price> 
    <Cost>11,98</Cost> 
    <Period></Period> 
    <Currency>USD</Currency> 
    </OrderItem> 
    <OrderItem xmlns=""> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>9</OrderNumber> 
    <ItemNumber>2</ItemNumber> 
    <Description>Coca-Cola</Description> 
    <Quantity>2</Quantity> 
    <Price>2,19</Price> 
    <Cost>4,38</Cost> 
    <Period></Period> 
    <Currency>USD</Currency> 
    </OrderItem> 
    <OrderItem xmlns=""> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>10</OrderNumber> 
    <ItemNumber>0</ItemNumber> 
    <Description>Shop: Hunting and fishing</Description> 
    <Quantity></Quantity> 
    <Price></Price> 
    <Cost></Cost> 
    <Period>2017-04</Period> 
    <Currency></Currency> 
    </OrderItem> 
    <OrderItem xmlns=""> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>10</OrderNumber> 
    <ItemNumber>1</ItemNumber> 
    <Description>Fishing rod</Description> 
    <Quantity>2</Quantity> 
    <Price>10,90</Price> 
    <Cost>21,80</Cost> 
    <Period></Period> 
    <Currency>USD</Currency> 
    </OrderItem> 
    <OrderItem xmlns=""> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>10</OrderNumber> 
    <ItemNumber>2</ItemNumber> 
    <Description>Bait</Description> 
    <Quantity>5</Quantity> 
    <Price>1,00</Price> 
    <Cost>5,00</Cost> 
    <Period></Period> 
    <Currency>USD</Currency> 
    </OrderItem> 
    <OrderItem xmlns=""> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>10</OrderNumber> 
    <ItemNumber>3</ItemNumber> 
    <Description>Hunting gun</Description> 
    <Quantity>1</Quantity> 
    <Price>999,00</Price> 
    <Cost>999,00</Cost> 
    <Period></Period> 
    <Currency>USD</Currency> 
    </OrderItem> 
</Root> 

Avec un schéma plat semblable à ceci:

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns="http://BizTalkMassCopy.FlatFileSchema3" targetNamespace="http://BizTalkMassCopy.FlatFileSchema3" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:annotation> 
    <xs:appinfo> 
     <schemaEditorExtension:schemaInfo namespaceAlias="b" extensionClass="Microsoft.BizTalk.FlatFileExtension.FlatFileExtension" standardName="Flat File" xmlns:schemaEditorExtension="http://schemas.microsoft.com/BizTalk/2003/SchemaEditorExtensions" /> 
     <b:schemaInfo standard="Flat File" codepage="65001" default_pad_char=" " pad_char_type="char" count_positions_by_byte="false" parser_optimization="speed" lookahead_depth="3" suppress_empty_nodes="false" generate_empty_nodes="true" allow_early_termination="false" early_terminate_optional_fields="false" allow_message_breakup_of_infix_root="false" compile_parse_tables="false" root_reference="Root" /> 
    </xs:appinfo> 
    </xs:annotation> 
    <xs:element name="Root"> 
    <xs:annotation> 
     <xs:appinfo> 
     <b:recordInfo structure="delimited" child_delimiter_type="hex" child_delimiter="0xD 0xA" child_order="infix" sequence_number="1" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" /> 
     </xs:appinfo> 
    </xs:annotation> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:annotation> 
      <xs:appinfo> 
      <groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" /> 
      </xs:appinfo> 
     </xs:annotation> 
     <xs:element name="Header"> 
      <xs:annotation> 
      <xs:appinfo> 
       <b:recordInfo structure="delimited" child_delimiter_type="char" child_delimiter=";" child_order="infix" sequence_number="1" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" /> 
      </xs:appinfo> 
      </xs:annotation> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:annotation> 
       <xs:appinfo> 
        <groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" /> 
       </xs:appinfo> 
       </xs:annotation> 
       <xs:element name="HeaderOrderDate" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="1" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="HeaderOrderNumber" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="2" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="HeaderItemNumber" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="3" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="HeaderDescription" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="4" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="HeaderQuantity" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="5" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="HeaderPrice" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="6" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="HeaderCost" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="7" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="HeaderPeriod" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="8" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="HeaderCurrency" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="9" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element maxOccurs="unbounded" name="OrderItem"> 
      <xs:annotation> 
      <xs:appinfo> 
       <b:recordInfo structure="delimited" child_delimiter_type="char" child_delimiter=";" child_order="infix" sequence_number="2" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" /> 
      </xs:appinfo> 
      </xs:annotation> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:annotation> 
       <xs:appinfo> 
        <groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" /> 
       </xs:appinfo> 
       </xs:annotation> 
       <xs:element name="OrderDate" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="1" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="OrderNumber" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="2" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="ItemNumber" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="3" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="Description" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="4" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="Quantity" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="5" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="Price" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="6" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="Cost" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="7" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="Period" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <b:fieldInfo justification="left" sequence_number="8" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
       <xs:element name="Currency" type="xs:string"> 
       <xs:annotation> 
        <xs:appinfo> 
        <fieldInfo sequence_number="9" justification="left" xmlns="http://schemas.microsoft.com/BizTalk/2003" /> 
        </xs:appinfo> 
       </xs:annotation> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Et puis utilisez une carte pour obtenir le résultat final, avec mécanisme de regroupement tels que Grouping in Biztalk Map Based on Multiple Elements

+0

Le format de résultat est correct, mais le format entrant est totalement différent de mon. Je suis nouveau dans BizTalk et je ne suis pas fort dans les transformations – Vitaliy

1

Ma solution est ,

  1. Créez un schéma source pour analyser votre fichier plat.

    enter image description here

  2. Créer un schéma de destination pour résultat groupé

    enter image description here

  3. Créer une carte pour votre schéma groupe source.

enter image description here

  1. Ajouter ce script XSLT inline sur votre carte

Pour le premier script Functoid

<xsl:key name="groups" match="Order" use="OrderNumber"/> 

Pour la deuxième script functoid

<xsl:for-each select="Order[generate-id(.)=generate-id(key('groups',OrderNumber))]"> 
    <xsl:sort select="OrderNumber" order="ascending"/> 
     <xsl:choose> 
     <xsl:when test="OrderDate != 'OrderDate'"> 
      <Order> 
       <OrderDate><xsl:value-of select="OrderDate/text()" /></OrderDate> 
       <OrderNumber><xsl:value-of select="OrderNumber/text()" /></OrderNumber> 
       <Description><xsl:value-of select="Description/text()" /></Description> 
       <Period><xsl:value-of select="Period/text()" /></Period> 
       <Items> 
        <xsl:for-each select="key('groups',OrderNumber)"> 
        <xsl:choose> 
         <xsl:when test="ItemNumber > '0'"> 
          <Item> 
           <ItemNumber><xsl:value-of select="ItemNumber" /></ItemNumber> 
           <Quantity><xsl:value-of select="Quantity" /></Quantity> 
           <Price><xsl:value-of select="Price" /></Price> 
           <Cost><xsl:value-of select="Cost" /></Cost> 
           <Currency><xsl:value-of select="Currency" /></Currency> 
          </Item> 
         </xsl:when> 
        </xsl:choose> 
        </xsl:for-each> 
       </Items> 
      </Order> 
     </xsl:when> 
     </xsl:choose> 
</xsl:for-each> 
  1. Testez votre carte et obtenez cette sortie.
<ns0:Orders xmlns:ns0="http://BizTalkServerTestProject.FlatFileSchema6"> 
    <Order> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>10</OrderNumber> 
    <Description>Shop: Hunting and fishing</Description> 
    <Period>2017-04</Period> 
    <Items> 
     <Item> 
     <ItemNumber>1</ItemNumber> 
     <Quantity>2</Quantity> 
     <Price>10,90</Price> 
     <Cost>21,80</Cost> 
     <Currency>USD</Currency> 
     </Item> 
     <Item> 
     <ItemNumber>2</ItemNumber> 
     <Quantity>5</Quantity> 
     <Price>1,00</Price> 
     <Cost>5,00</Cost> 
     <Currency>USD</Currency> 
     </Item> 
     <Item> 
     <ItemNumber>3</ItemNumber> 
     <Quantity>1</Quantity> 
     <Price>999,00</Price> 
     <Cost>999,00</Cost> 
     <Currency>USD</Currency> 
     </Item> 
    </Items> 
    </Order> 
    <Order> 
    <OrderDate>30-04-17</OrderDate> 
    <OrderNumber>9</OrderNumber> 
    <Description>Shop: McDonalds</Description> 
    <Period>2017-04</Period> 
    <Items> 
     <Item> 
     <ItemNumber>1</ItemNumber> 
     <Quantity>2</Quantity> 
     <Price>5,99</Price> 
     <Cost>11,98</Cost> 
     <Currency>USD</Currency> 
     </Item> 
     <Item> 
     <ItemNumber>2</ItemNumber> 
     <Quantity>2</Quantity> 
     <Price>2,19</Price> 
     <Cost>4,38</Cost> 
     <Currency>USD</Currency> 
     </Item> 
    </Items> 
    </Order> 
</ns0:Orders> 

Vous pouvez trouver le code source complet des schémas et la carte de cette URL. http://blog.sarslan.com/group-source-schema-in-a-map/

+0

Cela semble bien, mais vous avez oublié [l'en-tête] (https://i.stack.imgur.com/4h025.png) dans le schéma de fichier plat lors de la reconstruction de la solution. J'ai aussi une erreur: 'Le fonctoid Scripting, qui se connecte au noeud cible 'Order', a une erreur dans sa définition 'Xslt Call-Template': 'Il n'y a pas de noeud xsl: template à la racine du xslt .'' – Vitaliy

+0

Vous avez raison, j'ai totalement oublié la ligne d'en-tête, j'ai fait des changements pour cela sur le script XSLT. Je n'ai pas eu cette exception. Pour comparer, vous pouvez télécharger le fichier de solution à partir de ce http://blog.sarslan.com/wp-content/uploads/2017/09/BizTalkServerTestProject.rar –