В вычислительной технике RELAX NG ( REgular LAnguage for XML Next Generation ) — это язык схемы XML . Схема RELAX NG определяет шаблон структуры и содержимого XML-документа. Схема RELAX NG сама по себе является XML- документом, но RELAX NG также предлагает популярный компактный синтаксис, отличный от XML. [1] По сравнению с другими языками схем XML RELAX NG считается относительно простым.
Он был определен спецификацией технического комитета OASIS RELAX NG в 2001 и 2002 годах на основе RELAX Мураты Макото и TREX Джеймса Кларка , [2] [3] [4] , а также частью второй международной стандарт ISO / IEC 19757: Языки определения схемы документа ( DSDL ). [5] [6] ISO/IEC 19757-2 был разработан ISO/IEC JTC 1/SC 34 и опубликован в своей первой версии в 2003 году . [7]
Предположим, мы хотим определить чрезвычайно простую схему разметки XML для книги: книга определяется как последовательность из одной или нескольких страниц; каждая страница содержит только текст. Пример экземпляра XML-документа может быть следующим:
<книга > <страница> Это первая страница . </page> <page> Это вторая страница . </страница> </книга>
Схема RELAX NG может быть записана во вложенной структуре путем определения корневого элемента, который содержит дальнейшие определения элементов, которые сами могут содержать встроенные определения. Схема нашей книги в этом стиле с использованием полного синтаксиса XML будет выглядеть следующим образом:
<element name= "book" xmlns= "http://relaxng.org/ns/structure/1.0" > <oneOrMore> <element name= "page" > <text/> </element> </oneOrMore> </ элемент>
Вложенная структура становится громоздкой из-за большого количества подуровней и не может определять рекурсивные элементы, поэтому в наиболее сложных схемах RELAX NG используются ссылки на определения именованных шаблонов , расположенные отдельно в схеме. Здесь «плоская схема» определяет точно такую же разметку книги, как и в предыдущем примере:
<grammar xmlns= "http://relaxng.org/ns/structure/1.0" > <start> <element name= "book" > <oneOrMore> <ref name= "page" /> </oneOrMore> </element > </start> <define name= "page" > <element name= "page" > <text/> </element> </define> </grammar>
Компактный синтаксис RELAX NG — это формат, отличный от XML, созданный на основе расширенной формы Бэкуса-Наура и регулярных выражений , разработанный таким образом, чтобы его можно было однозначно преобразовать в его аналог XML и обратно, с однозначным соответствием по структуре и значению. во многом так же, как Simple Outline XML (SOX) относится к XML . Он имеет много общего с синтаксисом DTD . Вот компактная форма приведенной выше схемы:
элемент книги { элемент страницы { текст } + }
С помощью именованных шаблонов это можно свести к:
начало = элемент книги { страница+ }
страница = страница элемента { текст }
Компактный парсер RELAX NG будет обрабатывать эти два шаблона как один и тот же.
Хотя спецификация RELAX NG была разработана примерно в то же время, что и спецификация W3C XML Schema , последняя, возможно, была более известна и более широко реализована как в открытых, так и в частных синтаксических анализаторах и редакторах XML, когда она стала Рекомендацией W3C в 2001 году. затем, однако, поддержка RELAX NG все чаще нашла свое применение в программном обеспечении XML, и ее принятию способствовало ее принятие в качестве основной схемы для популярных языков разметки, ориентированных на документы, таких как DocBook , TEI Guidelines, OpenDocument и EPUB .
RELAX NG разделяет с W3C XML Schema многие функции, которые отличают их от традиционных DTD : типизация данных , поддержка регулярных выражений , поддержка пространства имен , возможность ссылаться на сложные определения.
По неофициальному соглашению схемы RELAX NG в обычном синтаксисе обычно имеют расширение имени файла «.rng». Для схем с компактным синтаксисом используется расширение «.rnc».
Схемы Relax NG не обязательно являются «детерминированными» или «однозначными».
Схемы Relax NG можно преобразовать в DTD, применив Trang, который можно найти по адресу: [1]. Руководство для Транга находится по адресу [2]. Обратите внимание, что Транг не может преобразовать схему OASIS DITA 1.3 в DTD, из-за чего возникают такие сообщения:
извините, объединение определений с помощью join="choice" не поддерживается