Множественные входные файлы?

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

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

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

<xsl:for-each select = "{IO Selector Here}">
    <xsl:variable select = "document(@url)" name = "contents" />
    <!--More stuff here-->
</xsl:for-each>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
9 620
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я не думаю, что 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. Таким образом, ваш метод может обрабатывать часть ввода-вывода файла.

Другие вопросы по теме