Weitere Atome

(Auszug aus "XML Schema" von Eric van der Vlist)

Jetzt kennen Sie bereits die einfachsten Atome, die in Mustern verwendet werden können: »1«, »5« und »\.« sind Atome, die auf genau ein Zeichen passen. Die anderen Atome, die in Mustern verwendet werden können, sind: Sonderzeichen, ein Wildcard-Zeichen, das auf ein beliebiges Zeichen paßt, und vordefinierte sowie benutzerdefinierte Zeichenklassen.

Sonderzeichen

Die folgende Tabelle zeigt die Liste der Atome, die auf ein einzelnes Zeichen passen, genau wie die Zeichen, die wir bereits gesehen haben, die aber auch Zeichen entsprechen, denen das Escape-Zeichen vorangestellt werden muß oder die (im Falle der ersten drei Zeichen in der Liste) nur der Bequemlichkeit halber zur Verfügung stehen.

Tabelle: Sonderzeichen

\n Newline (kann auch als »
« geschrieben werden, da wir uns in einem XML-Dokument befinden)
\r Carriage Return (kann auch als »
« geschrieben werden)
\t Tabulator (kann auch als »	« geschrieben werden)
\\ Zeichen \
\| Zeichen |
\. Zeichen .
\- Zeichen -
\^ Zeichen ^
\? Zeichen ?
\* Zeichen *
\+ Zeichen +
\{ Zeichen {
\} Zeichen }
\( Zeichen (
\) Zeichen )
\[ Zeichen [
\] Zeichen ]

Wildcard

Das Zeichen ».« hat eine besondere Bedeutung: Es ist ein Wildcard- oder Joker-Atom, das auf jedes zulässige XML-Zeichen mit Ausnahme von Newline und Carriage Return paßt. Wie auf jedes Atom kann auch auf ».« wahlweise ein Quantifier folgen. ».*« ist eine gängige Konstruktion, um null oder mehr beliebige Zeichen anzugeben. Die Verwendung von ».*« (und die Tatsache, daß xs:pattern ein Schweizer Offiziersmesser ist) veranschaulicht das folgende Muster, das auf die ganzzahligen Vielfachen von 10 paßt:

<xs:simpleType name="multipleOfTen">
  <xs:restriction base="xs:integer">
    <xs:pattern value=".*0"/>
  </xs:restriction>
</xs:simpleType>

Zeichenklassen

W3C XML Schema hat die »klassischen« Perl-Zeichenklassen und die Unicode-Zeichenklassen übernommen (nicht jedoch die Zeichenklassen im POSIX-Stil, die in Perl ebenfalls zur Verfügung stehen).

Klassische Perl-Zeichenklassen

W3C XML Schema unterstützt die klassischen Perl-Zeichenklassen zuzüglich einiger Erweiterungen für die besonderen Bedürfnisse von XML. Jede dieser Klassen wird durch einen einzelnen Buchstaben bezeichnet. Die Klassen, die durch die groß- bzw. die kleinbuchstabige Version desselben Buchstabens bezeichnet werden, sind zueinander komplementär:

\s Whitespace. Paßt auf die XML-Whitespace-Zeichen (Leerzeichen #x20, Tabulator #x09, Newline #x0A und Carriage Return #x0D).
\S Zeichen, die kein Whitespace sind.
\d Ziffern (0 bis 9, aber auch Ziffern aus anderen Alphabeten).
\D Zeichen, die keine Ziffern sind.
\w Erweiterte »Wort«-Zeichen (jedes Unicode-Zeichen, das nicht als »Interpunktion«, »Trennzeichen« oder »Sonstige« definiert ist). Dies stimmt mit der Perl-Definition überein, vorausgesetzt, die Unterstützung für UTF8 ist eingeschaltet.
\W Nicht-Wort-Zeichen.
\i Namensanfangszeichen laut XML 1.0 (d.h. alle Buchstaben sowie »_«). Dies ist eine Erweiterung von W3C XML Schema gegenüber den regulären Ausdrücken von Perl.
\I Zeichen, die nicht als Anfangszeichen eines XML-Namens verwendet werden dürfen.
\c Namenszeichen laut XML 1.0 (Namensanfangszeichen, Ziffern, ».«, »:«, »-« und die Zeichen, die von Unicode als »Combining« oder »Extender« definiert sind). Dies ist eine Erweiterung von W3C XML Schema gegenüber den regulären Ausdrücken von Perl.
\C Zeichen, die nicht in einem Namen gemäß XML 1.0 verwendet werden dürfen.

Diese Zeichenklassen können wahlweise mit einem Quantifier verwendet werden, genau wie alle anderen Atome. Das vorige Muster, das wir betrachtet haben:

<xs:pattern value=".*0"/>

schränkt den lexikalischen Raum so ein, daß es sich um eine Zeichenkette mit einer Null am Ende handeln muß. Wenn wir wissen, daß der Basistyp ein xs:integer ist, ist dies für unsere Zwecke gut genug; wenn der Basistyp jedoch xs:decimal (oder xs:string ) wäre, könnten wir stärker einschränken, indem wir schreiben:

<xs:pattern value="-?\d*0"/>

Dies stellt sicher, daß die Zeichen vor der am Ende stehenden Null Ziffern sind, denen wahlweise ein - vorangeht. (Wir werden später in dem Abschnitt »Festes Format« sehen, wie man ein optionales führendes - oder + angibt.)

Unicode-Zeichenklassen

Muster unterstützen Zeichenklassen, die sowohl auf Unicode- Kategorien als auch auf -Blöcke passen. Kategorien und Blöcke sind zwei sich ergänzende Klassifikationssysteme: Kategorien klassifizieren die Zeichen nach ihrer Verwendung, unabhängig von ihrer räumlichen Herkunft (also Buchstaben, Großbuchstaben, Ziffern, Interpunktion usw.), während Blöcke die Zeichen nach ihrer räumlichen Herkunft unabhängig von ihrer Verwendung klassifizieren (Lateinisch, Arabisch, Hebräisch, Tibetisch und sogar Gothisch oder Notenzeichen).

Die Schreibweise \p{Name} ist für Blöcke und Kategorien ähnlich. Das Präfix Is wird dem Namen von Kategorien hinzugefügt, um den Unterschied klarzumachen. Die Schreibweise \P{Name} steht ebenfalls zur Verfügung, um die Zeichen auszuwählen, die nicht zu dem angegebenen Block bzw. der Kategorie gehören. Eine Aufstellung von Unicode-Blöcken und Kategorien ist in der Spezifikation angegeben. Die folgende Tabelle zeigt die Unicode-Zeichenklassem und die nächste die Unicode-Zeichenblöcke.

Tabelle: Unicode-Zeichenklassen

Unicode-ZeichenklasseEnthält
C andere Zeichen (Nicht-Buchstaben, Nicht-Symbole, Nicht-Zahlen, Nicht-Trennzeichen)
Cc Steuerzeichen
Cf Formatierungszeichen
Cn nicht zugewiesene Codepunkte
Co Zeichen für den Privatgebrauch
L Buchstaben
No andere Zahlen
P Interpunktion
Pc verbindende Interpunktion
Pd Striche
Pe schließende Interpunktion
Pf Anführungsende (kann sich wie Ps oder Pe verhalten)
Mc kombinierende Marken mit Platzbedarf
Me einschließende Marken
Mn Marken ohne Platzbedarf
N Zahlen
Nd Dezimalziffern
Nl Zahlbuchstaben
Ll Kleinbuchstaben
Lm Modifizierungszeichen
Lo andere Buchstaben
Lt Titelschreibweisen-Buchstaben
Lu Großbuchstaben
M alle Marken
Pi Anführungsanfang (kann sich wie Ps oder Pe verhalten)
Po andere Interpunktionszeichen
Ps öffnende Interpunktion
S Symbole
Sc Währungssymbole
Sk Modifizierungssymbole
Sm mathematische Symbole
So andere Symbole
Z Trennzeichen
Zl Zeilentrennzeichen
Zp Absatztrennzeichen
Zs Whitespace

 

Tabelle: Unicode-Zeichenblöcke

AlphabeticPresentationForms Arabic ArabicPresentationForms-A
ArabicPresentationForms-B Armenian Arrows
BasicLatin Bengali BlockElements
Bopomofo BopomofoExtended BoxDrawing
BraillePatterns ByzantineMusicalSymbols Cherokee
CJKCompatibility CJKCompatibilityForms CJKCompatibilityIdeographs
CJKCompatibilityIdeographsSupplement CJKRadicalsSupplement CJKSymbolsandPunctuation
CJKUnifiedIdeographs CJKUnifiedIdeographsExtensionA CJKUnifiedIdeographsExtensionB
CombiningDiacriticalMarks CombiningHalfMarks CombiningMarksforSymbols
ControlPictures CurrencySymbols Cyrillic
Deseret Devanagari Dingbats
EnclosedAlphanumerics EnclosedCJKLettersandMonths Ethiopic
GeneralPunctuation GeometricShapes Georgian
Gothic Greek GreekExtended
Gujarati Gurmukhi HalfwidthandFullwidthForms
HangulCompatibilityJamo HangulJamo HangulSyllables
Hebrew HighPrivateUseSurrogates HighSurrogates
Hiragana IdeographicDescriptionCharacters IPAExtensions
Kanbun KangxiRadicals Kannada
Katakana Khmer Lao
Latin-1Supplement LatinExtended-A LatinExtendedAdditional
LatinExtended-B LetterlikeSymbols LowSurrogates
Malayalam MathematicalAlphanumericSymbols MathematicalOperators
MiscellaneousSymbols MiscellaneousTechnical Mongolian
MusicalSymbols Myanmar NumberForms
Ogham OldItalic OpticalCharacterRecognition
Oriya PrivateUse PrivateUse
PrivateUse Runic Sinhala
SmallFormVariants SpacingModifierLetters Specials
Specials SuperscriptsandSubscripts Syriac
Tags Tamil Telugu
Thaana Thai Tibetan
UnifiedCanadianAboriginalSyllabics YiRadicals YiSyllables

Wir wissen noch nicht, wie wir Schnittmengen zwischen einem Block und einer Kategorie in einem einzigen Muster angeben oder wie wir angeben können, daß ein Datentyp nur aus elementaren lateinischen Buchstaben zusammengesetzt sein darf. Um diese Klassifikationen zu »kreuzen« und die Schnittmenge des Blocks L (alle Buchstaben) und der Kategorie BasicLatin (ASCII-Zeichen unterhalb von #x7F) zu definieren, können wir daher zwei aufeinanderfolgende Einschränkungen verwenden:

<xs:simpleType name="BasicLatinLetters">
  <xs:restriction>
    <xs:simpleType>
      <xs:restriction base="xs:token">
        <xs:pattern value="\p{IsBasicLatin}*"/>
      </xs:restriction>
    </xs:simpleType>
    <xs:pattern value="\p{L}*"/>
  </xs:restriction>
</xs:simpleType>

Benutzerdefinierte Zeichenklassen

Diese Klassen sind Listen von Zeichen innerhalb von eckigen Klammern, die – zur Angabe von Bereichen und ein führendes ^ zur Negation der gesamten Liste – folgendes akzeptieren:

[azertyuiop]

definiert die Liste der Buchstaben in der obersten Reihe einer französischen Tastatur,

[a-z]

spezifiziert alle Buchstaben zwischen »a« und »z« einschließlich,

[^a-z]

steht für alle Buchstaben, die nicht zwischen »a« und »z« liegen, aber

[-^\\]

definiert die Zeichen »-«, »^« und »\«, während

[-+]

auf das Vorzeichen einer Zahl paßt.

Diese Beispiele reichen aus, um zu erkennen, daß das, was zwischen diesen eckigen Klammern steht, einer speziellen Syntax und Semantik unterliegt. Genau wie bei der Schreibweise für reguläre Ausdrücke im allgemeinen haben wir hier eine Liste von Atomen. Anstatt jedoch jedes Atom gegen ein Zeichen des Instanz-Strings anzulegen, definieren wir einen logischen Raum. Zwischen den Atomen und der Zeichenklasse steht die Menge der Zeichen, die auf irgendeines der Atome passen, die zwischen den eckigen Klammern stehen.

Man kann hier auch zwei Sonderzeichen erkennen, die je nach dem Ort ihres Auftretens unterschiedliche Bedeutungen haben können Das Zeichen - , das einen Bereich anzeigt, wenn es beispielsweise zwischen a und z steht, ist ein normales Zeichen, wenn es unmittelbar hinter der öffnenden oder direkt vor der schließenden Klammer steht ( [+-] und [-+] sind deswegen gleichermaßen zulässig). Im Gegensatz dazu verliert ^ , das am Anfang einer Klassenspezifikation als Negationszeichen wirkt, seine Sonderbedeutung und wird ein ganz normales Zeichen, wenn es weiter hinten in der Klassendefinition auftritt.

Als Escape-Zeichen fungiert der Backslash: »\\« wird verwendet, wenn das Zeichen »\« gemeint ist. Tatsächlich kann man in einer Klassendefinition alle Escape-Sequenzen, die wir als Atome kennengelernt haben, verwenden. Auch wenn einige der Sonderzeichen ihre spezielle Bedeutung innerhalb von eckigen Klammern verlieren, dürfen sie stets ein Escape-Zeichen tragen. Deswegen kann die Klasse

[-^\\]

auch als

[\-\^\\]

oder als

[\^\\-]

geschrieben werden, da es auf die Reihenfolge der Zeichen nicht mehr ankommt, wenn sie als Escape-Sequenzen auftreten.

Innerhalb von eckigen Klammern behält das Zeichen »\« weiterhin seine Bedeutung für Referenzen auf Perl- oder Unicode-Klassen. Die Angabe

[\d\p{Lu}]

steht für die Menge aus Dezimalziffern (Perl-Klasse \d ) und Großbuchstaben (Unicode-Kategorie »Lu«).

Mathematiker haben herausgefunden, daß drei grundlegende Operationen ausreichen, um mit Mengen zu operieren, und daß diese Operationen aus einer größeren Anzahl von Operationen ausgewählt werden können. Bei unseren eckigen Klammern haben wir bereits zwei dieser Operationen gesehen: Vereinigung (eckige Klammern stehen für eine implizite Vereinigung ihrer Atome) und Komplement (ein einleitendes ^ realisiert das Komplement der Menge, die danach innerhalb der eckigen Klammern definiert ist). W3C XML Schema erweitert die Perl-Regeln für reguläre Ausdrücke und führt eine dritte Operation ein: die Differenz zwischen Mengen. Die Schreibweise

[menge1-[menge2]]

steht für alle Zeichen in menge1 , die nicht zu menge2 gehören, wobei menge1 und menge2 alle Syntaxtricks verwenden können, die wir bisher kennengelernt haben.

Dieser Operator kann verwendet werden, um Schnittmengen von Zeichenklassen zu bilden (die Schnittmenge zwischen zwei Mengen A und B ist die Differenz zwischen A und dem Komplement von B). Damit können wir jetzt eine Klasse BasicLatinLetters definieren:

[\p{IsBasicLatin}-[^\p{L}]]

Oder wir können die Klasse mit Hilfe von \P , das ebenfalls für das Komplement steht, so schreiben:

[\p{IsBasicLatin}-[\P{L}]]

Die entsprechende Datentyp-Definition würde dann lauten:

<xs:simpleType name="BasicLatinLetters">
  <xs:restriction base="xs:token">
    <xs:pattern value="[\p{IsBasicLatin}-[\P{L}]]*"/>
  </xs:restriction>
</xs:simpleType>

Oder-Verknüpfung und Gruppierung

In unserem ersten Beispielmuster haben wir drei getrennte Muster verwendet, um drei mögliche Werte auszudrücken. Wir können diese Definition mit Hilfe des Zeichens »|«, das außerhalb von eckigen Klammern als »oder«-Operator dient, kompakter schreiben. Die Definition des einfachen Typs sieht dann so aus:

<xs:simpleType name="myByte">
  <xs:restriction base="xs:byte">
    <xs:pattern value="1|5|15"/>
  </xs:restriction>
</xs:simpleType>

Diese Schreibweise ist konzentrierter, ob sie aber auch besser lesbar ist, sei dahingestellt. Diese »oder«-Konstruktion wäre auch nicht sehr interessant, wenn es nicht möglich wäre, sie in Verbindung mit Gruppen zu verwenden. Gruppen sind vollständige reguläre Ausdrücke, die ihrerseits als Atome betrachtet werden. Sie können wahlweise mit einem Quantifier versehen werden, um vollständigere (und komplexere) reguläre Ausdrücke aufzubauen. Gruppen werden in die runden Klammern »(« und »)« eingeschlossen. Um eine kommagetrennte Liste der Werte »1«, »5« oder »15« zu definieren, wobei Whitespace zwischen Werten und Kommata ignoriert wird, könnte das folgende Muster verwendet werden:

<xs:simpleType name="myListOfBytes">
  <xs:restriction base="xs:token">
    <xs:pattern value="(1|5|15)( *, *(1|5|15))*"/>
  </xs:restriction>
</xs:simpleType>

Wir verlassen uns hier auf die Whitespace-Verarbeitung des Basis-Datentyps (xs:token faßt Whitespace zusammen). Wir haben nicht auf führenden oder am Ende stehenden Whitespace geprüft, weil dieser ohnedies entfernt wird, und wir haben mit dem folgenden Atom nur auf einzelne Leerzeichen vor und nach dem Komma geprüft:

runback " * " runback

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML Schema bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML Schema" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de