2009-03-12 7 views
4

J'ai une longue liste de valeurs en XML avec des identifiants nommés. J'ai besoin de faire des fichiers de sortie séparés pour chacun des identifiants distincts regroupés et nommés de façon unique.Valeurs énumérées basées sur des valeurs distinctes XSLT 2.0

Ainsi, par exemple, disons que j'ai:

<List> 
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
     Hello World! 
    </Item> 
    <Item group="::this_other_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
     Goodbye World! 
    </Item> 
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
     This example text should be in the first file 
    </Item> 
    <Item group="::this_other_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
     This example text should be in the second file 
    </Item> 
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
     Hello World! 
    </Item> 
</List> 

Comment puis-je écrire une transformation (XSLT 2.0) à la sortie de ces regroupés en noms de fichiers générés et unique valeur? Par exemple: la cartographie de la première @group à file1.xml et le second @group à file2.xml

+0

Après la clarification dans les commentaires que j'édité ma réponse pour que la solution produit maintenant les deux fichiers recherchés xml. –

+0

Excellent travail comme toujours Dimitre –

Répondre

3

Voici une solution qui utilise quelques-unes des bonnes nouvelles fonctionnalités XSLT 2.0:

Cette transformation:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
     <!--             --> 
    <xsl:template match="/*"> 
     <xsl:variable name="vTop" select="."/> 
     <!--             --> 
     <xsl:for-each-group select="Item" group-by="@group"> 
      <xsl:result-document href="file:///C:/Temp/file{position()}.xml"> 
      <xsl:element name="{name($vTop)}"> 
       <xsl:copy-of select="current-group()"/> 
      </xsl:element> 
      </xsl:result-document> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur le document Xml OP fourni (corrigé à bien formé!):

<List> 
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
     Hello World! 
    </Item> 
    <Item group="::this_other_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
      Goodbye World! 
    </Item> 
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
      This example text should be in the first file 
</Item> 
    <Item group="::this_other_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
      This example text should be in the second file 
</Item> 
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::"> 
      Hello World! 
    </Item> 
</List> 

produit les deux fichiers recherchés: file1.xml et file2.xml

+0

C'est une excellente solution, Dimitre. Je vois toujours du bon travail de votre part. Cependant, nous cherchons à placer le texte groupé dans deux fichiers. Y a-t-il une syntaxe supplémentaire que nous pouvons ajouter pour que cela se produise? –

+0

@Jweede Vous n'avez pas spécifié les critères sur lesquels effectuer le groupement: Quels nœuds doivent aller à quel des deux fichiers - selon quelle règle? –

+0

@Dimitre: J'ai eu du mal à articuler ce problème, je suis désolé si ce n'était pas clair. Il y a deux attributs de groupe distincts, nous voulons les mettre ensemble. c'est-à-dire: placer tous les attributs de groupe correspondants dans un fichier ensemble. –

Questions connexes