Вопрос

Можно ли в документе XSLT перебрать набор файлов в текущем каталоге?

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

Я думал в этом направлении:

<xsl:for-each select="{IO Selector Here}">
    <xsl:variable select="document(@url)" name="contents" />
    <!--More stuff here-->
</xsl:for-each>
Это было полезно?

Решение

В 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, чтобы document('dir://c:/foo/') возвращал список файлов в каталоге 'c:\foo' в произвольном формате, который вы хотите.См. следующие ссылки для получения дополнительной информации о пользовательских XmlResolver:

Настройка класса XmlUrlResolver
Возможности XmlResolver

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top