Pregunta

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

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 funcionando bien en un solo documento, pero me gustaría ampliarla sin tener que recurrir a otra herramienta para fusionar los documentos xml.

Estaba pensando en estas líneas:

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

Solución

En XSLT 2.0 y con Saxon, puedes hacer esto con el collection() función:

<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 independiente.Su entorno puede proporcionarle dicha herramienta;por ejemplo, Cocoon tiene un Generador de directorios que crea tal índice.Pero sin saber cuál es su entorno, es difícil saber qué recomendar.

Otros consejos

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

Personalizando la clase XmlUrlResolver
El poder de XmlResolver

También puedes recurrir al uso de scripts (como el msxsl: guión elemento) o extensiones en su hoja de estilo XSLT.

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

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

Si tuviera un documento principal y un conjunto fijo de documentos de respaldo, posiblemente podría usar el document() función para devolver nodos y/o valores específicos, pero sospecho que su caso es diferente.

Desde XSLT creo que esto no será posible.

Puede pasar todos los nombres de archivos XML a un <xsl:param name="files" /> como una lista separada por comas y recorrerlos usando recursividad y substring-before() y substring-after().

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 de Java) para procesar la entrada y transformarla en salida.Sería fácil de empaquetar con un archivo por lotes para bucle.

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

Si está utilizando .Net, puede utilizar XsltExtension para realizar llamadas desde su documento XSLT a métodos en su clase .net.Luego, el método podría devolver conjuntos de nodos a su XSLT.Entonces su método podría manejar la parte del archivo IO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top