2010-11-12 5 views
5

J'ai un fichier XSLT afin de transformer une grande quantité de données. Je voudrais ajouter une fonctionnalité "split", soit en tant que XSLT chaîné ou dans le XSLT courant qui peut créer plusieurs fichiers de sortie afin de limiter la taille des fichiers sous un certain seuil. Supposons que le fichier XML d'entrée est comme ci-dessous:Fichiers de sortie fractionnés XSLT - groupement muenchian

<People> 
<Person>    
<name>John</name>    
<date>June12</date>    
<workTime taskID="1">34</workTime>    
<workTime taskID="2">12</workTime>    
</Person>    
<Person>    
<name>John</name>    
<date>June13</date>    
<workTime taskID="1">21</workTime>    
<workTime taskID="2">11</workTime>    
</Person> 
<Person>    
<name>Jack</name>    
<date>June19</date>    
<workTime taskID="1">20</workTime>    
<workTime taskID="2">30</workTime>    
</Person>  
</People> 

Le fichier XSLT est comme ci-dessous en utilisant le regroupement muenchian. Cependant, je voudrais, en sortie, plusieurs fichiers comme ci-dessous au lieu d'un grand. Pour cet exemple, je n'ai défini qu'un seul nom par fichier ... mais cela devrait être un paramètre.

fichier de sortie pour la première personne:

<People> 
    <Person> 
     <name>John</name> 
     <taskID>1</taskID> 
     <workTime> 
     <date>June12</date> 
     <time>34</time> 
     </workTime> 
     <workTime> 
     <date>June13</date> 
     <time>21</time> 
     </workTime> 
    </Person> 
    <Person> 
     <name>John</name> 
     <taskID>2</taskID> 
     <workTime> 
     <date>June12</date> 
     <time>12</time> 
     </workTime> 
     <workTime> 
     <date>June13</date> 
     <time>11</time> 
     </workTime> 
    </Person> 
</People> 

fichier de sortie pour la deuxième personne:

<People> 
    <Person> 
     <name>Jack</name> 
     <taskID>1</taskID> 
     <workTime> 
     <date>June19</date> 
     <time>20</time> 
     </workTime> 
    </Person> 
    <Person> 
     <name>Jack</name> 
     <taskID>2</taskID> 
     <workTime> 
     <date>June19</date> 
     <time>30</time> 
     </workTime> 
    </Person> 
</People> 

Quelle serait la meilleure approche et la plus élégante en utilisant XSLT 1.0? Y at-il un moyen d'appeler un XSLT enchaîné dans le XSLT afin de diviser les fichiers de sortie?

Cheers.

+0

Bonne question, +1. Voir ma réponse pour un certain nombre de façons de le faire. –

Répondre

6

Est-il possible d'appeler un XSLT enchaînée dans le XSLT afin de séparer les fichiers de sortie ?

Quelques façons:

  1. Vous pouvez écrire une fonction d'extension pour faire - consultez la documentation de votre processeur XSLT.

  2. Utilisez le dans le cas où l'élément d'extension <exsl:document> de EXSLT, cela est pris en charge par votre processeur XSLT

  3. Utilisez l'élément d'extension <saxon:output> si vous avez 6.x Saxon

  4. En une boucle de votre langage de programmation appelle une transformation distincte, en lui passant comme paramètre le nom de la personne pour laquelle produire des résultats.

Voici des exemples de code pour 2. et 3.ci-dessus:

En utilisant <saxon:output>:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:saxon="http://icl.com/saxon" 
    extension-element-prefixes="saxon" > 

<xsl:template match="/"> 
    <xsl:for-each select="/*/*[not(. > 3)]"> 
    <saxon:output href="c:\xml\doc{.}"> 
    <xsl:copy-of select="."/> 
    </saxon:output> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

lorsque cette transformation est appliquée sur le document XML suivant:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 

trois fichiers: c:\xml\doc1, c:\xml\doc2 et c:\xml\doc3 sont créés avec le contenu voulu .

Le même exemple en utilisant <exslt:document>:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
    extension-element-prefixes="saxon" > 

<xsl:template match="/"> 
    <xsl:for-each select="/*/*[not(. > 3)]"> 
    <ext:document href="c:\xml\doc{.}"> 
    <xsl:copy-of select="."/> 
    </ext:document> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 
+0

Je pense que exsl: document semble être la meilleure idée. Avez-vous un aperçu de la façon dont cela fonctionnerait pour l'exemple en particulier? – Daniel

+0

@Daniel: J'ai ajouté deux exemples de code: pour '' et pour '' –

+0

@Dimitre. Merci et avez-vous un aperçu de la façon dont votre solution peut être fusionnée avec le groupement XSLT dans la question? – Daniel