Прочитайте удаленный ZIP-архив с помощью XSL - PullRequest
3 голосов
/ 10 июня 2010

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

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 10 июня 2010

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

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

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

1 голос
/ 10 июня 2010

Если вы используете 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>
1 голос
/ 10 июня 2010

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

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

0 голосов
/ 11 июня 2010

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

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

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

0 голосов
/ 10 июня 2010

Я только что попробовал процессор 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", которая, я думаю, является последней версией.

...