2010-05-06 9 views
3

J'ai un code XML suivant:Tri fichier XML par l'attribut

<Group> 
    <GElement code="x"> 
     <Group> 
      <GElement code="x"> 
       <fname>a</fname> 
       <lname>b</lname> 
      </GElement> 
      <GElement code ="f"> 
       <fname>fa</fname> 
      </GElement> 
     </Group> 
    </GElement> 
    <GElement code ="f"> 
    </GElement> 
</Group> 

Je voudrais avoir la sortie triée par « code » comme:

<Group> 
    <GElement code ="f"> 
    </GElement> 
    <GElement code="x"> 
     <Group> 
      <GElement code ="f"> 
       <fname>fa</fname> 
      </GElement> 
      <GElement code="x"> 
       <fname>a</fname> 
       <lname>b</lname> 
      </GElement> 
     </Group> 
    </GElement> 
</Group> 

La profondeur de l'arbre peut être sans fin c'est-à-dire que le GElement peut avoir un autre groupe et ainsi de suite.

Des idées?

+0

Je soupçonne qu'il existe une solution XSL pour cela, mais je ne poste pas de réponse parce que je ne suis pas entièrement certain. – FrustratedWithFormsDesigner

+0

La minute où vous commencez à vous inquiéter de l'apparence de votre XML est le moment où vous réalisez que vous avez trop de temps libre. – Will

+2

@Will: Cela peut être vrai pour l'indentation, mais l'ordre des documents a une signification en XML, alors pourquoi ne pas implémenter quelque chose qui repose aussi sur l'ordre des documents? – Tomalak

Répondre

5

Utilisez XslCompiledTransform (see MSDN) pour appliquer ce styleshet à votre document XML:

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <!-- the identity template copies everything verbatim --> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*" /> 
    </xsl:copy> 
    </xsl:template> 

    <!-- special template for <Group> that sorts its children --> 
    <xsl:template match="Group"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> <!-- copy attributes, if any --> 
     <xsl:apply-templates select="GElement"> 
     <xsl:sort select="@code" /> 
     </xsl:apply-templates> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

XML profondeur d'imbrication de l'arbre peut être arbitraire.

+0

... ouais, quelque chose comme ça, c'était ce que je pensais. – FrustratedWithFormsDesigner

+0

@tomalak, votre premier xsl: template a un tag de fin xsl: apply-templates –

+0

aussi, est '' nécessaire? Y a-t-il une différence dans la sortie si vous l'enlevez? –