2008-09-19 2 views
6

В документе XSLT можно ли перебрать набор файлов в текущем каталоге?Несколько входных файлов?

У меня есть ситуация, когда у меня есть каталог, полный xml-файлов, для которого требуется некоторый анализ для создания отчета. У меня есть таблица стилей, работающая на одном документе, но я хотел бы расширить это, не перейдя на другой инструмент для объединения XML-документов.

Я думал вдоль этих линий:

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

ответ

8

В XSLT 2.0, и с Saxon, вы можете сделать это с помощью функции collection():

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

См http://www.saxonica.com/documentation/sourcedocs/collections.html для более подробной информации ,

В XSLT 1.0 вам необходимо создать индекс, в котором перечислены документы, которые вы хотите обработать, с помощью отдельного инструмента. Ваша среда может предоставить такой инструмент; например, Cocoon имеет Directory Generator, который создает такой индекс. Но, не зная, что такое ваша среда, трудно понять, что рекомендовать.

0

Я не думаю, что XSL настроен работать таким образом: он предназначен для использования в чем-то еще на одном или нескольких документах, а что-то другое будет отвечать за поиск файлов, к которым должен применяться XSLT.

Если у вас есть один основной документ и фиксированный набор поддерживающих документов, вы можете использовать document() function для возврата определенных узлов и/или значений, но я подозреваю, что ваш случай отличается.

0

От XSLT Я думаю, что это будет невозможно.

Вы можете передать все имена файлов XML в < xsl: param name = "files"/> в виде списка, разделенного запятой, и перебрать его через рекурсию и подстроку-before() и substring-after().

0

У меня есть инструмент командной строки, который можно использовать для этого - он использует процессор XSLT, встроенный в Ant (инструмент сборки java) для обработки ввода + преобразования в вывод. Было бы легко обернуть пакетным файлом для цикла.

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

2

Как говорили другие, вы не можете делать это независимым от платформы способом. В мире .NET вы можете создать собственный XmlResolver, чтобы документ ('dir: // c:/foo /') возвращал список файлов в каталоге 'c: \ foo' в произвольном формате. Смотрите следующие ссылки для получения дополнительной информации о пользовательских XmlResolver-х:

Customizing the XmlUrlResolver Class
The power of XmlResolver

Также вы можете прибегнуть к помощи сценариев (например msxsl:script элемента) или расширения в вашей таблицы стилей XSLT.

Все эти подходы сделают ваш XSLT-код незарегистрированным для других платформ.

0

Если вы используете .Net, вы можете использовать XsltExtension, чтобы делать вызовы из вашего документа XSLT методам в вашем .net классе. Затем метод может вернуть узлы обратно в ваш XSLT. Таким образом, ваш метод может обрабатывать часть IO файла.

Смежные вопросы