2009-09-06 10 views
0

J'ai un répertoire de fichiers XML ... par exemple:XML Résumé en utilisant XSLT

result.xml 
    result2.xml 
    result3.xml 
    resultNth.xml (because there is an unknown amount of files) 

le schéma dans chaque fichier résultat serait le même essentiellement

<Succeeded> 
      <someStrongXMLObject> 

      </someStrongXMLObject> 
    </Succeeded> 

Ma question est - peut J'inclus 1 fichier XML supplémentaire appelé results.xml dans ce répertoire ... et un fichier XSL qui formatera les résultats ...

Je veux créer un résumé de tous les fichiers de résultats ... de sorte que les données de tous ces f Iles seront incluses dans le résumé.

Est-ce possible? Sans utiliser de C# - juste du XML standard, XSLT?

Mise à jour

Je ne pense pas une solution, juste un signe de tête, oui il est possible, ou un non retentissant .. J'ai besoin de mettre en œuvre certaines C#. Je voudrais aussi que la structure du répertoire soit AAAA/MM/JJ - afin que je puisse avoir des fichiers XML récapitulatifs, qui vont recréer des sous-répertoires pensés ... et créer des résumés mensuels et annuels.

+0

L'exemple XML doit être mis à jour. Vous avez réussi et réussi; les balises d'ouverture et de fermeture doivent correspondre. –

Répondre

2

Oui, c'est certainement possible.

La simplicité dépend de la fiabilité de vos noms de fichiers et de noms de dossiers. Vous pouvez utiliser le document() function pour vérifier la présence d'un fichier de résultats. Utilisez la récursivité pour continuer à rechercher le fichier séquentiel suivant jusqu'à la fin.

votre exemple les noms de fichiers, le XSLT suivant peut être utilisé:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="/"> 
     <summary> 
      <xsl:call-template name="getResults"> 
       <!--First call, use empty index --> 
       <xsl:with-param name="index" /> 
      </xsl:call-template> 
     </summary> 
    </xsl:template> 

    <xsl:template name="getResults"> 
     <xsl:param name="index" /> 
     <xsl:variable name="filename"> 
      <xsl:choose> 
       <xsl:when test="$index =''"> 
        <xsl:value-of select="concat('result', '.xml')" /> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:value-of select="concat('result', $index, '.xml')" /> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:variable> 
     <xsl:choose> 
      <!--Check for the presence of the file --> 
      <xsl:when test="document($filename)"> 
       <!--If it exists, then output something from the document--> 
       <Result> 
        <xsl:attribute name="href"> 
         <xsl:value-of select="$filename" /> 
        </xsl:attribute> 
        <xsl:copy-of select="document($filename)/Succeeded" /> 
       </Result> 
       <!--Then, call the function with a new index value to look for the next file--> 
       <xsl:call-template name="getResults"> 
        <xsl:with-param name="index"> 
         <xsl:choose> 
          <!--If empty index, start at 1 --> 
          <xsl:when test="$index=''"> 
           <xsl:value-of select="1" /> 
          </xsl:when> 
          <xsl:otherwise> 
           <!--Add 1 to the previous index value --> 
           <xsl:value-of select="number($index+1)" /> 
          </xsl:otherwise> 
         </xsl:choose> 
        </xsl:with-param> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:comment>Done looking for Results. Found <xsl:value-of select="number($index)" /> files.</xsl:comment> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

Je l'ai couru avec 3 documents de résultats dans le même dossier que le XSLT (c.-à-result.xml, result1.xml, result2.xml) et produit la sortie suivante:

<?xml version="1.0" encoding="utf-8"?> 
<summary> 
<Result href="result.xml"> 
<Succeeded> 
     <someStrongXMLObject> 

     </someStrongXMLObject> 
    </Succeeded> 
</Result> 
<Result href="result1.xml"> 
<Succeeded> 
     <someStrongXMLObject> 

     </someStrongXMLObject> 
    </Succeeded> 
</Result> 
<Result href="result2.xml"> 
<Succeeded> 
     <someStrongXMLObject> 

     </someStrongXMLObject> 
    </Succeeded> 
</Result> 
<!--Done looking for Results. Found 3 files.--> 
</summary> 
+0

Selon la profondeur/longueur de la structure du répertoire, la récursivité peut atteindre une limite stricte. Pas très probable, mais possible. Un moyen de contourner cela serait une approche itérative/hybride - un fichier XML d'aide avec environ 100 nœuds que vous pouvez parcourir (''). Une fois que vous avez atteint 100, vous pouvez prendre une étape récursive et recommencer. Juste une idée. – Tomalak

Questions connexes