Хобрук: Ваш путь к мастерству в программировании

Прочитайте удаленный заархивированный xml только с помощью XSL

Я хочу знать, возможно ли для XSLT-файла считывать данные из XML, расположенного в папках удаленного почтового индекса (с рабочего сервера), без каких-либо внешних процессоров (saxon и т. д.) и без загрузки.

Если это не удастся, я прибегну к простому чтению информации из почтового индекса... что подводит меня к другой моей (новой) проблеме.

В настоящее время у меня есть XSLT, который обращается и получает данные из загруженного и извлеченного XML-файла, но я не могу сделать это без его извлечения. Я читал, что с помощью Altova и xslt 2.0 можно читать из zip-файла с помощью функции document(), хотя пока мне это не удалось.

вот как я пытаюсь это сделать: document('name.zip|zip/folder/folder2/iwantthis.xml')

Просто файл не находит. Я был бы почти бесконечно благодарен, если бы вы указали мне на мои ошибки и привели меня к XSLThood.

Спасибо любезно

10.06.2010

  • Хороший вопрос (+1). Смотрите мой ответ для решения с использованием EXPath. 10.06.2010

Ответы:


1

Я не думаю, что есть общий способ сделать это.

Однако во многих процессорах XSLT на основе Java (по крайней мере, Saxon и Xalan) вы можете использовать 'jar:' URL для ссылки на ресурсы внутри zip-файлов. Добавьте к URL-адресу, указывающему на zip-файл, префикс jar: и суффикс !/ и путь к файлу внутри него. Вот так: jar:file:///the/path/to/foo.zip!/foo.xml.

Чтобы добиться того же в других процессорах, вам, вероятно, потребуется выяснить, позволяют ли они регистрировать собственный «обработчик URI» или его эквивалент для работы со специальными URI, которые вы хотите поддерживать.

10.06.2010

2

Если ваша файловая система не предоставляет собственный прозрачный способ доступа к zip-файлу, как если бы это была папка, это будет невозможно.

Другими словами: вы должны иметь возможность открыть путь, который вы пытались передать document(), в любой другой программе в вашей системе. Если это не работает больше нигде, почему вы предполагаете, что это будет работать в XSLT?

10.06.2010

3

Если вы используете Saxon, вы можете использовать EXPath Zip Facility .

Вот пример:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                xmlns:zip="http://www.expath.org/mod/zip"
                version="2.0">

   <xsl:import href="http://www.expath.org/mod/zip.xsl"/>

   <xsl:output indent="yes"/>

   <!--
       $file is the ZIP file to use.  If $entry is set, extract that
       entry from $file, as an XML document.  If not, list the content
       of $file.
   -->
   <xsl:param name="file"  as="xs:string"/>
   <xsl:param name="entry" as="xs:string?"/>

   <xsl:template name="main" match="/">
      <xsl:choose>
         <xsl:when test="$entry">
            <!-- an XML entry in the ZIP file -->
            <xsl:sequence select="zip:xml-entry($file, $entry)"/>
         </xsl:when>
         <xsl:otherwise>
            <!-- the structure of the ZIP file -->
            <xsl:sequence select="zip:entries($file)"/>
         </xsl:otherwise>
      </xsl:choose>
   </xsl:template>

</xsl:stylesheet>
10.06.2010

4

Я только что попробовал обработчик XSLT 2.0 командной строки инструментов AltovaXML со следующей таблицей стилей XSLT 2.0:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:template name="main">
    <xsl:copy-of select="document('ziptest1.zip|zip/ziptest1/file.xml')"/>
  </xsl:template>

</xsl:stylesheet>

где «ziptest1.zip» — это файл .zip с папкой с именем «ziptest1», содержащей файл с именем «file.xml», а вывод, который я получаю, — это содержимое этого файла. Если путь не может быть разрешен, я получаю сообщение об ошибке «Ошибка получения ресурса».

Я проверил это с помощью «AltovaXML Version 2010 rel. 3», которая, как мне кажется, является последней версией.

10.06.2010
  • Я немного смущен вашим ответом. Что означает вывод, который я получаю, это содержимое этого файла? это сработало, например, вы могли найти все, что вам нужно, в xml? Я спрашиваю, потому что сразу после этого вы сказали, что когда путь не может быть разрешен, вы получаете ошибку. Не уверен, удалось вам это или нет. Ошибка, которую я получаю (используя примерно тот же метод: foreach вместо copyof), - это что-то вроде того, что указанный ресурс не может быть найден (переведен). Я думаю, что это то же самое, что и у вас (глупые немцы с их описаниями ошибок). Кроме того, я использую Altova XMLspy 2007. Спасибо. 11.06.2010
  • С заявленной версией инструментов AltovaXML я могу получить доступ к XML-документу в zip-документе, как я показал. Поддерживает ли Altova XML Spy 2007 это, я не знаю, проверьте документацию или спросите на форуме поддержки Altova. 11.06.2010

  • 5

    Судя по тому, что я получил, прочитав все ваши (очень быстрые) ответы, и поскольку использование одного только XSLT вызвало «вероятно-невозможные» ответы и саксонский разговор, я думаю, что саксонский путь - это то, что нужно. Сначала я попробую это дома, чтобы увидеть, насколько хлопотно установить/использовать, учитывая, что обычно всякий раз, когда я упоминаю об установке чего-либо на работе, мне отказывают (я стажер). Я просто подожду, пока Мартин Хоннен ответит на мой комментарий.

    Большое спасибо за ваше время, а также за столь быстрый ответ.

    Изменить: спасибо, Мартин, проверю документацию по этой функции.

    11.06.2010
  • Я только что понял, кажется, что это единственное место, куда я смотрел. Я много бродил по интернету, прежде чем написать сюда. Хорошо, просто хотел прояснить это. 11.06.2010
  • Новые материалы

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

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

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..