Потоковое XML с XProc - PullRequest
       52

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

2 голосов
/ 18 мая 2009

Я играю с 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 ]

2 голосов
/ 06 декабря 2012

Вот как вы можете сделать это с 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>
2 голосов
/ 02 сентября 2011

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

1 голос
/ 30 марта 2010

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

1 голос
/ 10 марта 2010

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

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

1 голос
/ 07 июня 2009

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

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

0 голосов
/ 12 ноября 2011

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

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

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

Приветствия

...