<3 Relax NG

2010-09-30

Mir gefällt an Relax NG, dass es wesentlich lesbarer ist als das schwergewichtigere W3C Schema XML – library.rnc:

default namespace = "http://meingold.de/schema/any/library"

start = element library {
   element book {
      element title { xsd:string },
      element author { xsd:string },
      element isbn { xsd:string { pattern='[0-9]{3}-[0-9]{10}' } },
      element quantity { xsd:positiveInteger  }
   }* 
}

Wenn man jedoch auf W3C Schema XML angewiesen ist, dann kann mit dem Kommandozeilen-Tool Trang ein Relax NG Schema in ein W3C XML Schema umgewandelt werden.

RNC -> XSD

trang library.rnc library.xsd

Das generierte W3C Schema sieht dann, wie folgt, aus – library.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
              elementFormDefault="qualified" 
              targetNamespace="http://meingold.de/schema/any/library" 
              xmlns:library="http://meingold.de/schema/any/library">
  <xs:element name="library">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="library:book"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="book">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="library:title"/>
        <xs:element ref="library:author"/>
        <xs:element ref="library:isbn"/>
        <xs:element ref="library:quantity"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="title" type="xs:string"/>
  <xs:element name="author" type="xs:string"/>
  <xs:element name="isbn">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="[0-9]{3}-[0-9]{10}"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="quantity" type="xs:positiveInteger"/>
</xs:schema>

Und um zu zeigen, dass das generierte Schema funktioniert, kann gegen das folgende XML im nächsten Schritt validiert werden – library.xml:

<?xml version="1.0" encoding="UTF-8"?>
<library xmlns="http://meingold.de/schema/any/library">
  <book>
    <title>Do Androids Dream of Electric Sheep?</title>
    <author>Philip K. Dick</author>
    <isbn>978-0575079939</isbn>
    <quantity>8</quantity>
  </book>
  <book>
    <title>Brave New World</title>
    <author>Aldous Huxley</author>
    <isbn>978-0099477464</isbn>
    <quantity>5</quantity>
  </book>
  <book>
    <title>Last Chance to See</title>
    <author>Douglas Adams</author>
    <isbn>978-0099536796</isbn>
    <quantity>3</quantity>
  </book>
</library>

Mit dem generierte XML Schema und dem Kommandozeilen-Tool xmllint kann das obige XML validiert werden:

xmllint --valid --schema library.xsd library.xml

Der umgekehrte Schritt, aus W3C XML Schema ein Relax NG Schema zu generieren, ist meines Wissens nicht möglich, da Relax NG nicht sämtliche Ausdrucksmöglichkeiten abbilden kann, die von XML Schema angeboten werden.