2008-09-19 20 views
6

Dentro de un documento XSLT, ¿es posible recorrer un conjunto de archivos en el directorio actual?¿Entradas de varios archivos?

Tengo una situación en la que tengo un directorio lleno de archivos xml que necesitan algún análisis para generar un informe. Tengo mi hoja de estilo operando en un único documento, pero me gustaría extender eso sin ir a otra herramienta para combinar los documentos xml.

yo estaba pensando a lo largo de estas líneas:

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

Respuesta

8

En XSLT 2.0, y con Saxon, que puede hacer esto con la función collection():

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

Ver http://www.saxonica.com/documentation/sourcedocs/collections.html para más detalles .

En XSLT 1.0, debe crear un índice que enumere los documentos que desea procesar con una herramienta separada. Su entorno puede proporcionar dicha herramienta; por ejemplo, Cocoon tiene un Directory Generator que crea dicho índice. Pero sin saber cuál es su entorno, es difícil saber qué recomendar.

0

No creo XSL está configurado para funcionar de esa manera: está diseñado para ser utilizado por alguna otra cosa en uno o más documentos, y la otra cosa sería responsable de encontrar los archivos a los que se debería aplicar el XSLT.

Si tenía un documento principal y un conjunto fijo de documentos de soporte, podría usar el document() function para devolver nodos y/o valores específicos, pero sospecho que su caso es diferente.

0

Desde dentro de XSLT, creo que esto no será posible.

Usted podría pasar en todos los nombres de los archivos XML a un < xsl: param name = "archivos"/> como una lista separada por comas y el bucle separado sobre ella utilizando la recursividad y la subcadena antes() y substring-después().

0

Tengo una herramienta de línea de comandos que podría usarse para esto: utiliza el procesador XSLT integrado en Ant (la herramienta de compilación java) para procesar la entrada + transformar en salida. Sería fácil de envolver con un archivo por lotes para el bucle.

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

2

Como han dicho otros, no puede hacerlo de forma independiente de la plataforma. En .NET world, podría crear un XmlResolver personalizado para que el documento ('dir: // c:/foo /') devuelva la lista de archivos en el directorio 'c: \ foo' en un formato arbitrario que desee. Consulte los siguientes enlaces para obtener más información sobre XmlResolver de encargo:

Customizing the XmlUrlResolver Class
The power of XmlResolver

También se puede recurrir al uso de secuencias de comandos (como el elemento msxsl:script) o extensiones en su hoja de estilo XSLT.

Todos estos enfoques harán que su código XSLT sea inportable para otras plataformas.

0

Si usa .Net, puede usar XsltExtension para realizar llamadas desde su documento XSLT a métodos en su clase .net. El método podría devolver los conjuntos de nodos a su XSLT. Entonces su método podría manejar la parte del archivo IO.