2010-11-03 91 views
2

Y a-t-il une carte BizTalk pour forcer la création d'éléments de destination lorsque les éléments source n'existent pas sans l'utilisation d'un modèle d'appel xslt?BizTalk force la création d'éléments vides sans utiliser le modèle d'appel xslt

Je suis mappage parent/child xml à un schéma généré par l'adaptateur wcf-sql qui a des paramètres de table pour les paramètres proc stockés.

donc ma source xml est:

<Category> 
    <CategoryId>1</CategoryId> 
    <CategoryName>Test</CategoryName> 
</Category> 

et/ou une catégorie avec Media

<Category> 
    <CategoryId>1</CategoryId> 
    <CategoryName>Test</CategoryName> 
    <Media> 
    <Medium> 
     <MediumId>1</MediumId> 
     <MediumName>test.jpg</MediumName> 
    </Medium> 
    </Media> 
</Category> 

Le schéma de la TypedProcedure est quelque chose comme:

<ImportCategoryRequest> 
    <Category> 
    <CategoryId>1</CategoryId> 
    <CategoryName>Test</CategoryName> 
    </Category> 
    <Media> 
    <Medium> 
     <MediumId>1</MediumId> 
     <MediumName>test.jpg</MediumName> 
    </Medium> 
    </Media> 
</ImportCategoryRequest> 

Il doesn n'aime pas quand tout ce qui apparaît dans le XML de destination. Au lieu de passer null pour un paramètre table-évalué il veut au moins 1 rangée et passer des valeurs nulles pour les colonnes dans le tvp. Je peux créer le xml fictif avec un modèle d'appel xslt mais je voudrais éviter cela.

Répondre

3

Le mappeur BizTalk semble utiliser <xsl:for-each> et, par conséquent, ne générera pas d'élément de sortie s'il n'y a pas d'entrée. Mais l'utilisation de xslt est vraiment facile - voir here comment enlever le xslt de votre carte existante (et juste enlever l'échappement autour des guillemets doubles et des barres obliques), et changer la carte en XSLT personnalisé.

Le bit vous devez changer est autour des médias est quelque chose comme:

 <xsl:choose> 
      <xsl:when test="count(ns0:Media)!=0"> 
       <!-- Copy the mapper generated XSLT in the for each here--> 
       <xsl:foreach > 
        </xsl:for-each> 
       </xsl:when> 
      <xsl:otherwise> 
       <Media> 
        <Medium> 
         <MediumId>1</MediumId> 
         <MediumName>test.jpg</MediumName> 
        </Medium> 
       </Media> 
      </xsl:otherwise> 
     </xsl:choose> 
+0

Ainsi, au lieu d'un modèle faire toute la carte comme xslt? Je vais essayer ça, merci. –