Domanda

All'interno di un documento XSLT, è possibile eseguire il ciclo su un set di file nella directory corrente?

Ho una situazione in cui ho una directory piena di file XML che necessitano di alcune analisi per generare un rapporto. Ho il mio foglio di stile che funziona su un singolo documento, ma vorrei estenderlo senza passare a un altro strumento per unire i documenti XML.

Stavo pensando in questo modo:

<xsl:for-each select="{IO Selector Here}">
    <xsl:variable select="document(@url)" name="contents" />
    <!--More stuff here-->
</xsl:for-each>
È stato utile?

Soluzione

In XSLT 2.0 e con Saxon, puoi farlo con la funzione collection():

<xsl:for-each select="file:///path/to/directory">
  <!-- process the documents -->
</xsl:for-each>

Vedi http: // www .saxonica.com / documentazione / sourcedocs / collections.html per maggiori dettagli.

In XSLT 1.0, è necessario creare un indice che elenca i documenti che si desidera elaborare con uno strumento separato. Il tuo ambiente può fornire tale strumento; ad esempio, Cocoon ha un Directory Generator che crea un tale indice. Ma senza sapere qual è il tuo ambiente, è difficile sapere cosa raccomandare.

Altri suggerimenti

Come altri hanno detto, non puoi farlo in modo indipendente dalla piattaforma. Nel mondo .NET, è possibile creare un XmlResolver personalizzato in modo che il documento ('dir: // c: / foo /') restituisca l'elenco dei file nella directory 'c: \ foo' in un formato arbitrario che si desidera. Vedere i seguenti collegamenti per ulteriori informazioni sugli XmlResolver personalizzati:

Personalizzazione della classe XmlUrlResolver
Il potere di XmlResolver

Inoltre puoi ricorrere all'uso di script (come msxsl: script elemento) o estensioni nel foglio di stile XSLT.

Tutti questi approcci renderanno il tuo codice XSLT non portabile su altre piattaforme.

Dall'interno di XSLT penso che questo non sarà possibile.

È possibile passare tutti i nomi dei file XML a un < xsl: param name = " files " / Gt &; come un elenco separato da virgole e passarci sopra usando ricorsion e substring-before () e substring-after ().

Ho uno strumento da riga di comando che potrebbe essere usato per questo - usa il processore XSLT incorporato in Ant (lo strumento di compilazione Java) per elaborare l'input + trasformare in output. Sarebbe facile da avvolgere con un file batch per loop.

svn: //donie.homeip.net/public/tools

Se stai usando .Net puoi usare XsltExtension per effettuare chiamate dal tuo documento XSLT a metodi nella tua classe .net. Il metodo potrebbe quindi restituire i set di nodi all'XSLT. Quindi il tuo metodo potrebbe gestire la parte I / O del file.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top