2010-10-29 5 views
0

Je reçois des données à partir d'un WebService, qui ressemble à cetri sousentités dans un XML complexe dans BizTalk

Building 
    Address 
    -> Office 
     Name 
     CreationDate 
     -> Worker 
       Name 
       HiringDate 

Avant de faire un traitement ultérieur et transforme ce message, je dois trier les sous-noeuds (» Office "et" Worker ") de sorte que tous les bureaux sont triés par CreationDate, puis tous les travailleurs sont triés par HiringDate dans leur bureau. Jusqu'à présent, les seules solutions que j'ai vues pour le tri dans BizTalk étaient basées sur XSLT. Il y a quelques exemples qui montrent comment trier sur une structure plus simple (http://www.biztalkgurus.com/newsletter/TheBizTalker-Volume-03.html) mais ceux-ci ne fonctionneront pas tels quels puisque mon message a plusieurs niveaux.

Si vous ne savez pas comment (si cela est possible), écrivez une expression XSLT qui fera ce tri tout en préservant la structure du XML.

Est-il possible d'écrire une telle expression XSLT? À quoi ressemblerait-il?

+0

Veuillez publier un petit document XML et le résultat XML souhaité. –

Répondre

2

trouvé la solution ici: http://bloggingabout.net/blogs/wellink/archive/2005/12/09/10499.aspx

Si nous appliquons cette technique à notre exemple, nous obtenons cette XSLT

<xsl:for-each select="Office"> 
     <xsl:sort select="CreationDate" data-type="text" order="ascending"/>   
     <Office> 
      <xsl:copy-of select="Name"/> 
      <xsl:copy-of select="CreationDate"/> 
      <xsl:for-each select="Worker"> 
       <xsl:sort select="HiringDate" data-type="text" order="ascending"/> 
       <Worker> 
        <xsl:copy-of select="Name"/> 
        <xsl:copy-of select="HiringDate"/> 
       </Worker> 
      </xsl:for-each> 
     </Office> 
    </xsl:for-each> 

crochet Ensuite, dans la carte comme indiqué ci-dessous et il fonctionne très bien. alt text

0

Vous avez besoin d'un modèle de copie XSLT pour toutes les balises excluant Office et Worker, ainsi que de modèles de tri pour ces balises. par exemple modèles de copie:

<xsl:template match="node()"> 
    <xsl:if test="name()"> 
     <xsl:element name="{name()}"> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:element> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="text()"> 
    <xsl:value-of select="."/> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:copy> 
     <xsl:value-of select="."/> 
    </xsl:copy> 
</xsl:template> 

et modèles de tri:

<xsl:match="office_parent_tag_as_i_understand_Building"> 
    <xsl:apply-templates select="Office"> 
     <xsl:sort select="CreationDate" data-type="text" order="ascending"/> 
    </xsl:foreach> 
</xsl:template> 

& analogiques pour la balise travailleur

<xsl:match="worker_parent_tag_as_i_understand_Office"> 
    <xsl:apply-templates select="Worker"> 
     <xsl:sort select="HiringDate" data-type="text" order="ascending"/> 
    </xsl:foreach> 
</xsl:template> 

Ne pas oublier que xsl: fonctionne sorte uniquement avec des données numériques et le texte Pour trier par date, vous devez convertir la date en int ou string

+0

Je ne sais pas comment entrer tout ce XSLT dans biztalk (il n'a qu'une seule fenêtre de script pour XSLT en ligne et n'accepte pas un objet template dedans). Et comment vous vous connectez la sortie au schéma de droite dans ce cas? – TheOwlsAreNotWhatTheySeem