Pergunta

Dentro de um documento XSLT, é possível fazer um loop sobre um conjunto de arquivos no diretório atual?

Eu tenho uma situação onde eu tenho um diretório cheio de arquivos XML que precisam de alguma análise feita para gerar um relatório. Eu tenho o meu operacional de estilo em uma coima única documento, mas eu gostaria de estender essa sem ir para outra ferramenta para mesclar os documentos XML.

Eu estava pensando ao longo destas linhas:

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

Solução

Em XSLT 2.0, e com o Saxon, você pode fazer isso com a função collection():

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

http: // www .saxonica.com / documentation / sourcedocs / collections.html para mais detalhes.

Em XSLT 1.0, você tem que criar um índice que lista os documentos que você deseja processo com uma ferramenta separada. Seu ambiente pode fornecer essa ferramenta a; por exemplo, tem um casulo Directório Gerador que cria um índice de tais. Mas sem saber o que seu ambiente é, é difícil saber o que recomendar.

Outras dicas

Como outros disseram, você não pode fazê-lo de uma forma independente de plataforma. Em .NET mundo, você poderia criar um XmlResolver personalizado para que documento ( 'dir: // c: / foo /') deve retornar a lista de arquivos no 'c: \ foo' diretório em um formato arbitrário desejar. Veja os seguintes links para obter mais informações sobre personalizado XmlResolver de:

Personalizando o Classe XmlUrlResolver
O poder do XmlResolver

Além disso, você pode recorrer ao uso de scripts (como o msxsl: roteiro elemento) ou extensões em sua folha de estilo XSLT.

Todas estas abordagens fará seu código XSLT portável para outras plataformas.

Eu não acho XSL está configurado para funcionar dessa forma: ele é projetado para ser usado por outra coisa em um ou mais documentos, ea outra coisa seria responsável por encontrar arquivos para o qual devem ser aplicadas as XSLT.

Se você tivesse um documento principal e um conjunto fixo de documentos de apoio, você poderia usar o função document() para retornar nós e / ou valores específicos, mas eu suspeito que o seu caso é diferente.

De dentro XSLT acho que isso não será possível.

Você poderia passar em todos os nomes de arquivo XML para um como uma vírgula lista e circuito separado sobre ele usando recursão e substring-before () e substring-after () <. / p>

Eu tenho uma ferramenta de linha de comando que pode ser usado para isso - ele usa o processador XSLT embutido no Ant (a ferramenta de construção java) para entrada do processo + transformar em saída. Seria fácil para embrulhar com um arquivo de lote para loop.

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

Se você estiver usando .Net você pode usar XsltExtension para fazer chamadas a partir de seu documento XSLT para métodos em sua classe .net. O método poderia, então, retornar nodesets volta para o seu XSLT. Portanto, o seu método poderia manipular o arquivo IO parte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top