Можно ли в документе XSLT перебрать набор файлов в текущем каталоге?
У меня есть ситуация, когда у меня есть каталог, полный файлов xml, которые требуют некоторого анализа для создания отчета. Моя таблица стилей отлично работает с одним документом, но я хотел бы расширить ее, не прибегая к другому инструменту для объединения XML-документов.
Я думал в этом направлении:
<xsl:for-each select = "{IO Selector Here}">
<xsl:variable select = "document(@url)" name = "contents" />
<!--More stuff here-->
</xsl:for-each>





Я не думаю, что XSL настроен для работы таким образом: он предназначен для использования чем-то еще в одном или нескольких документах, и что-то еще будет отвечать за поиск файлов, к которым должен применяться XSLT.
Если бы у вас был один основной документ и фиксированный набор подтверждающих документов, вы могли бы использовать document() функция для возврата определенных узлов и / или значений, но я подозреваю, что ваш случай отличается.
Я думаю, что изнутри XSLT это будет невозможно.
Вы можете передать все имена XML-файлов в <xsl: param name = "files" /> в виде списка, разделенного запятыми, и перебрать его, используя рекурсию и substring-before () и substring-after ().
У меня есть инструмент командной строки, который можно использовать для этого - он использует XSLT-процессор, встроенный в Ant (инструмент сборки java), для обработки ввода + преобразования в вывод. Было бы легко обернуть пакетным файлом для цикла.
svn: //donie.homeip.net/public/tools
В 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 есть Генератор каталогов, который создает такой индекс. Но, не зная, какова ваша среда, трудно понять, что порекомендовать.
Как говорили другие, вы не можете сделать это независимо от платформы. В мире .NET вы можете создать собственный XmlResolver, чтобы документ ('dir: // c: / foo /') возвращал список файлов в каталоге 'c: \ foo' в произвольном формате. См. Следующие ссылки для получения дополнительной информации о пользовательских XmlResolver:
Настройка класса XmlUrlResolver
Возможности XmlResolver
Также вы можете прибегнуть к использованию скриптов (например, элемента msxsl: скрипт) или расширений в вашей таблице стилей XSLT.
Все эти подходы сделают ваш XSLT-код недоступным для других платформ.
Если вы используете .Net, вы можете использовать XsltExtension для выполнения вызовов из вашего XSLT-документа к методам вашего .net-класса. Затем метод может возвращать наборы узлов обратно в ваш XSLT. Таким образом, ваш метод может обрабатывать часть ввода-вывода файла.