Потоковое XML с XProc

Я играю с xproc, языком конвейерного XML и http://xmlcalabash.com/. Я хотел бы найти пример для потоковой передачи больших XML-документов. например, с учетом следующего огромного XML-документа:

<Books>
 <Book>
   <title>Book-1</title>
 </Book>
 <Book>
   <title>Book-2</title>
 </Book>
 <Book>
   <title>Book-3</title>
 </Book>

<!-- many many.... -->
 <Book>
   <title>Book-N</title>
 </Book>
</Books>

Как я должен перейти к циклу (потоковое) по x->N документов, таких как

<Books>
 <Book>
   <title>Book-x</title>
 </Book>
</Books>

и обрабатывать каждый документ с xslt? это возможно с xproc?

6 ответов

Вам следует взглянуть на QuiXProc ( http://code.google.com/p/quixproc), который представляет собой реализацию XProc на основе Calabash, в которой добавлены потоковая и параллельная обработка. Надеюсь, это поможет.

Вот как вы можете сделать это с XProc, который будет транслироваться с QuiXProc

<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="1.0">
  <p:load href="hugedocument.xml"/>
  <p:for-each>
    <p:iteration-source select="/Books/Book"/>
    <p:xslt>
      <p:input port="stylesheet">
        <p:document href="book.xsl"/>
      </p:input>
      <p:input port="parameters">
        <p:empty/>
      </p:input>
    </p:xslt>
  </p:for-each>
  <p:wrap-sequence wrapper="Books"/>    
  <p:store href="hugedocument.res.xml"/>
</p:declare-step>

Да, как бы мне не хотелось поддерживать потоковую передачу, мои настоящие цели для XML Calabash заключались в полноте и правильности.

У меня есть некоторые идеи по переработке внутренних компонентов XML Calabash, чтобы использовать больше возможностей потоковой передачи push / pull Saxon, но в моем списке "todo" также есть много других вещей:-/

Я помню недавнее обсуждение списка разработчиков XProc, связанного с потоковой передачей. Кажется, что Calabash не пытается потоковую передачу, см. Сообщение Нормана Уолша здесь.

Saxon SA поддерживает потоковую передачу для XSLT и XQuery, подробности см. По адресу: http://www.saxonica.com/documentation/sourcedocs/serial.html

Calumet от EMC ( http://developer.emc.com/xmltech) также не поддерживает потоковую передачу. До сих пор основное внимание уделялось соблюдению спецификации XProc вместе с интеграцией с другими нашими инструментами, связанными с XML, такими как собственная база данных XML xDB. Поддержка потоковой передачи находится на моем радаре, хотя я не могу сказать, когда смогу добраться до этого прямо сейчас.

Даже несмотря на то, что большинство процессоров XProc не передают данные между этапами, это не обязательно означает, что ваш случай не будет работать (например, будет расти с точки зрения использования памяти, например). Это зависит от того, что вы хотите сделать с результатом шага XSLT.

Если вы собираете результаты, пытаетесь создать один большой выходной файл, то да, это может быть проблемой. Но в этом случае вам может быть лучше использовать потоковое решение (SAX, STaX, JOOST parser, ...) в любом случае.

Если вы будете хранить результаты каждого XSLT отдельно, то проблема будет намного меньше. Вам нужно будет только позаботиться о том, достаточно ли у вас памяти для загрузки исходного документа и выполнения обработки каждого документа. Не уверен, насколько хорошо будет вести себя Saxon под XMLCalabash, но я ожидаю, что размер до 50 мегабайт не должен быть очень большой проблемой..

ура

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