Standard Relax NG Schemat strukturalizacji dokumentów Relax NG (relaxing). Opracowany głównie przez Jamesa Clarka i Makoto Muratę. Standard ISO: Information technology Document Schema Definition Language (DSDL) Part 2: Regular-grammar-based validation RELAX NG (ISO/IEC 19757-2003) W skrócie 90% funkcjonalności XML Schema przy 10% komplikacji. Dwa rodzaje składni: oparta o XML i nie. Ta druga nosi nazwę RNG Compact Syntax (RNC) Podstawowe konstrukcje Podstawowymi konstrukcjami są wzorce element oraz attribute: element nazwa{...} <element name= nazwa > attribute nazwa{... } <attribute name= nazwa > Elementy deklarujące wzorce (takie jak, np. element oraz attribute) muszą być kwalifikowane następującą przestrzenią nazw: http://relaxng.org/ns/structure/1.0 Prosta deklaracja atrybutu, tj. bez żadnych dodatkowych specyfikacji oznacza atrybut wymagany. Aby atrybut był opcjonalny należy jego deklarację umieścić wewnątrz optional. <element name= katalog xmlns= http://relaxng.org/ns/structure/1.0 > <oneormore> <element name= nazwa > <attribute name= cena > <text/> </attribute> <text/> <oneormore> Wzorzectext oznacza to samo co#pcdata w DTD. Wzorzecempty służy do deklarowania pustej zawartości elementu. Powyższy przykład w składni uproszczonej przedstawia się następująco: element katalog{ elementnazwa{attributecena{text}, text}* } c TP: Relax NG: 6 marca 2005 roku 1
Odpowiednikiem znanych z DTD encji parametrycznych jest konstrukcja nazwanego wzorca: nazwa-wzorca = wzorzec <define name="nazwa-wzorca">... </define> <ref name="nazwa-wzorca"/> Rekursja jest dozwolona. start = nazwa-wzorca <grammar> <start>... </start> </grammar> Element grammar ma pojedynczy element-dziecko start. Parser Relax NG dopasowuje dokument do wzorca określonego we wzorcu start. Określanie liczby powtórzeń i porządku Większość operatorów posiada znaczenie identyczne jak w przypadku DTD:? <optional> # wzorzec opcjonalny * <zeroormore> #0,1,... + <oneormore> #1,2,... <choice> #p1 p2oznaczap1lubp2, #najpierwp1potemp2 (...) <group> #grupa Wzorce group oraz choice mogą być zastosowane zarówno do atrybutów (w DTD było to niemożliwe) jak i elementów. & <interleave> Wzorzec interleave deklaruje dowolny porządek elementów-dzieci (podobna konstrukcja jest znana w standardzie SGML). Szczególnym przypadkiem jest jeżeli jednym z elementów-dzieci jest text. Tego typu zawartość określa się mianem zawartości mieszanej (mixed contet). W DTD porządek i liczba elementów o zawartości mieszanej jest nieokreślona (element może być nawet pusty). Relax NG pozwala na większą precyzję: c TP: Relax NG: 6 marca 2005 roku 2
&elementfirma{text} &elementnazwa{text}? &elementkolor{text}* }+ } <?xml version="1.0"?> <katalog> <czesc>na stanie mamy <kolor>czarne</kolor> i <kolor>srebrne</kolor> <nazwa>sztyce</nazwa> firmy <firma>campagnolo</firma> <czesc><!-- tu jest blad(brak firmy)--> na stanie mamy <kolor>czarne</kolor> i <kolor>srebrne</kolor> <nazwa>sztyce</nazwa> jakiejś firmy. <czesc><!--tujestblad(ojednanazwezaduzo)--> na stanie mamy <kolor>czarne</kolor> <nazwa>kierownice</nazwa> oraz <nazwa>mostki</nazwa> firmy <firma>cinelli</firma> </katalog> # Odpowiednik mixed contet: element katalog{ element czesc{ text &elementfirma{text}* &elementnazwa{text}* &elementkolor{text}* }+ } Określenie typu zawartości elementu/atrybutu Zawartości elementu/atrybutu może być sprawdzona za pomocą porównania do zewnętrznie zdefiniowanych typów. W ten sposób parser Relax NG może wspierać różne zestawy typów, a są one deklarowane za pomocą przypisania odpowiedniego URLa atrybutowi datatypelibrary. Aplikacja jing wspiera zestaw typów zdefiniowany w specyfikacji XML Schema, np: <element name= wiek > <data type= integer datatypelibrary= http://www.w3.org/2001/xmlschema-datatypes /> <param name= minexclusive ="0"/> <param name= maxexclusive ="150"/> c TP: Relax NG: 6 marca 2005 roku 3
datatypes xsd ="http://www.w3.org/2001/xmlschema-datatypes" element wiek{ # wiek jest liczbą calkowitą z przedzialu 1--149 xsd:integer{ minexclusive ="0" maxexclusive ="150"}} Jeżeli element data nie posiada atrybutu datatypelibrary, to obowiązuje wartość znaleziona w pierwszym elemencie przodku posiadającym atrybut datatypelibrary. Wyliczenia (enumerations) { "wart1" "wart2"} <choice> <value> wart1 </value> <value> wart2 </value> </choice> Element value może specyfikować typ zawartości za pomocą atrybutów type oraz datatypelibrary, w sposób identyczny jak w przypadku elementu data. Przykład: opcjonalny element, który może przyjąć wyłącznie wartości jadalny lub trujący: element typ{"jadalny" "trujacy"}? Modularność i łączenie definicji external"plik.rnc" <externalref href= plik.rng /> nazwa =... <define name= nazwa combine= choice > nazwa&=... <define name= nazwa combine= interleave > Element <grammar> może posiadać jako elementy-dzieci element <include>, służący do dołaczania zawartości pliku: include{ <include href= plik.rng />... <define... } </include> Dokumentowanie Jeżeli element posiada atrybut lub element-dziecko z innej przestrzeni nazw niż http://relaxng.org/ns/structure/1.0, to ten atrybut lub element-dziecko jest c TP: Relax NG: 6 marca 2005 roku 4
elementów z innej przestrzeni nazw. Przykład: namespace doc ="http://rowery.org/katalog/" [doc:doc="katalog zawiera dane dotyczace czesci"] element katalog{ [doc:doc="czesc: nazwa oraz cena(w zlotych)"] elementnazwa{attributecena{text}, text}*} Porównanie do DTD Brakuje: domyślnych wartości atrybutów encji, notacji oraz kontroli odstępów (significant whitespaces) Oprogramowanie Do sprawdzenia poprawności można wykorzystać parser jing uruchamiany w następujący sposób: jing-c plik.rnc plik.xml opcja-c oznacza, że szablon w pliku plik.rnc jest zapisany w notacji uproszczonej Aplikacja trang potrafi tłumaczyć składnie szablonów zapisanych w formatach dtd, xsd, rng i rnc. Przykładowo: trang-i rnc-o rng plik.rnc plik.rng zamienia szablon z formatu rnc na format rng. c TP: Relax NG: 6 marca 2005 roku 5