Несколько файловых входов? - PullRequest
6 голосов
/ 19 сентября 2008

В документе XSLT возможно ли зацикливание набора файлов в текущем каталоге?

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

Я думал так:

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

Ответы [ 6 ]

8 голосов
/ 19 сентября 2008

В 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 есть Генератор каталогов , который создает такой индекс. Но, не зная, какая у вас среда, сложно понять, что порекомендовать.

2 голосов
/ 19 сентября 2008

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

Настройка класса XmlUrlResolver
Сила XmlResolver

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

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

0 голосов
/ 22 сентября 2008

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

0 голосов
/ 19 сентября 2008

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

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

0 голосов
/ 19 сентября 2008

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

Вы можете передать все имена файлов XML в как список, разделенный запятыми, и перебрать его, используя recursion и substring-before () и substring-after ().

0 голосов
/ 19 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...