Статьи

Конвейеры XML: описание процесса

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

Конвейер XML

По определению «конвейер XML формируется, когда процессы XML, особенно преобразования XML и проверки XML, связаны друг с другом», это означает, что если мы отправим выходные данные проверки в качестве входных данных для преобразования (и это общий случай использования), мы имеем только что созданный конвейер XML, точнее линейный конвейер XML. Хорошо нелинейный конвейер — это тот, где мы выбираем между двумя ветвями процесса на основе условия, когда мы выполняем цикл, выполняем параллельные ветки или обрабатываем ошибки на лету.

XProc, W3C Рекомендуемый язык конвейера XML

XProc — это язык XML, описывающий процессы, использующий XSLT для преобразований и XSD, RelaxNG или Schematron для проверки. Самое замечательное в XProc — это то, что вы описываете обработку XML-документа на языке XML, используя в дальнейшем стандарты W3C.

Есть подвох

Что касается XProc, мы описываем процесс одним языком, проверяем другим языком и преобразуем еще одним языком. Используя три разных языка для описания даже самого простого варианта использования XML Pipelining, открывается огромное пространство для недостатков. Если мы хотим сделать что-то столь же тривиальное, как изменение имени одного элемента, мы должны сделать изменения на трех разных языках.

Альтернатива существует, она называется XDefinition

Если вы помните мою предыдущую статью под названием «Обработка XML и объединение валидации», где я кратко написал об интересной технологии XML под названием XDefinitions, вы найдете один язык, способный преобразовывать и проверять XML. И поскольку его способность проверять несколько входных данных, преобразовывать их и снова проверять выходные данные, все они написаны только на одном легко читаемом языке, пространство для ошибок ограничено неизбежным минимумом.

Простой XML-конвейер

 

Конвейер XML с помощью XDefinition
Каждый процесс XDefinition может инициировать другой процесс XDefinition. Этот тип масштабируемости позволяет нам моделировать линейные или нелинейные конвейеры XML одним языком. Если мы хотим изменить структуру, мы сделаем это только в одном месте.

<xd:def xmlns:xd = "http://www.syntea.cz/xdef/2.0" xd:root = "Weather" >

<!-- declaration of variables -->
<xd:declaration>
String $source; /*URL to source data */
float $sum = 0; /*total sum of temperatures */
int $n = 0; /*number of measurements*/
</xd:declaration>

<!-- model of input data -->
<Weather date = "optional datetime('yyyy-M-d')">
<Measurement xd:script = "occurs 1..;"
wind = "required float()"
temperature = "required float(-99, +99);
onTrue {/* process value of temperature. */
$n++; /* increase number of measurements. */
$sum += parseFloat(getText()); /* add value to total sum. */
}"
time = "required datetime('HH:mm')" />
</Weather>

<!-- model of result -->
<html xmlns = "http://www.w3.org/1999/xhtml"
xd:script="create parseXml($source, '*');
/* Parse and validate input data with the Weather xdefinition. */">
<body>
<h1> create "Date: " + from("/Weather/@date") </h1>
<li xd:script="occurs +; create from('//Weather/Measurement')">
create "Time: " + from("@time") +
", wind: " + from("@wind") +
", temperature: " + from("@temperature");
</li>
<h3>
create $n == 0 ? "No data" /* $n is equal to 0 */ :
"Average temperature : " + ($sum/$n); /*print average*/
</h3>
</body>
</html>

</xd:def>

 Входной документ

<?xml version="1.0" encoding="UTF-8"?>
<Weather date = "2005-05-11" >
<Measurement wind = "5.3" temperature ="13.0" time = "05:00" />
<Measurement wind = "7.2" temperature ="15.2" time = "11:00" />
<Measurement wind = "8.7" temperature ="18.1" time = "15:00" />
<Measurement wind = "3.9" temperature ="16.5" time = "20:00" />
</Weather>

 Выходной документ

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1>
Date: 2005-05-11
</h1>
<li>
Time: 05:00, wind: 5.3, temperature: 13.0
</li>
<li>
Time: 11:00, wind: 7.2, temperature: 15.2
</li>
<li>
Time: 15:00, wind: 8.7, temperature: 18.1
</li>
<li>
Time: 20:00, wind: 3.9, temperature: 16.5
</li>
<h3>
Average temperature : 15.7
</h3>
</body>
</html>

 Попробуйте этот пример здесь онлайн. Как вы видите, XDefinition содержит модель входного документа, по которой он проверяется. Вы даже можете использовать переменные из проверки в преобразовании / композиции, такие как $ n и $ sum (используемые в примере), которые являются глобальными для каждой модели XDefinition. Это очень важно, потому что XDefinition может завершить проверку с фатальными ошибками. Таким образом, ваш процесс не должен заканчиваться неверным, но правильно сформированным вводом. Недопустимый документ по-прежнему содержит значение информации, и вы можете работать с ним.

Почему « композиция »? Потому что состав слова лучше описывает процесс, который выполняется XDefinition. В настоящее время подавляющее большинство данных, генерируемых каждым процессом преобразования, имеют вывод XML. Если вы принимаете это как должное, весь XML-конвейер должен быть правильно сформирован, а преобразования — это композиции из более мелких узлов. Любая композиция с XDefinition — это моделирование данных XML, и ваш конвейер имеет полное право называться XML Pipeline.

 Ресурсы
—     http://www.syntea.cz/syntea_web/?page=xdef_guidepost&hl=en_US
—     http://en.wikipedia.org/wiki/XML_pipeline
—     http://www.w3.org/TR/xml-pipeline