David Maus

Today I Learned: Normalisierung von Attributwerten

Ein XML-Prozessor ist ein Programm, dass XML-Dokument gemäß der XML-Spezifikation verarbeitet. Wenn ein solcher Prozessor ein XML-Dokument einliest, dann werden die Werte in Attributen normalisiert, d.h. in eine standardisierte Form überführt. Die Regeln dieser Normalisierung sind in der XML-Spezifikation unter dem Punkt Attribute Value Normalization aufgeführt.

  1. Numerische Zeichenreferenzen werden durch das referenzierte Zeichen ersetzt.

    Der Prozessor ersetzt die Zeichenreferenz ä durch das referenzierte Zeichen 'ä' (U+00E4, LATIN SMALL LETTER A WITH DIAERESIS). Eine Anwendung, die mit dem so prozessierten XML-Dokument arbeitet "sieht" nie die Referenz, sondern immer nur das Zeichen.

  2. Entitätsreferenzen werden durch die referenzierte Entität ersetzt.

    Ist in der Dokumenttypdeklaration die Entität 'bspw.' als Zeichenfolge 'beispielsweise' deklariert, dann ersetzt der Prozessor jede im Attributwert vorkommende Referenz durch die entsprechende Zeichenfolge.

  3. Die Leerraumzeichen U+000D (CARRIAGE RETURN), U+000A (LINE FEED) und U+0009 (CHARACTER TABULATION) werden durch je ein Leerzeichen (U+0020, SPACE) ersetzt.

    Eine Ausnahme bildet die Abfolge von U+000D (CARRIAGE RETURN) und U+000A (LINE FEED), wenn sie aus einer deklarierten Entität stammt. Diese Abfolge von zwei Zeichen wird dann durch ein einzelnes Leerzeichen (U+0020, SPACE) ersetzt.

  4. Alle anderen Zeichen werden unverändert übernommen.

  5. Für Attribute deren Typ als Name, Nmtoken oder eine Liste eines dieser Typen definiert ist gelten weitere Regeln.

    In diesen Attributen können Leerzeichen allenfalls als Trennzeichen in einer Liste von Werten auftreten. Deshalb werden Leerzeichen am Anfang und am Ende des Attributwertes entfernt und aufeinanderfolgende Leerzeichen durch genau ein Leerzeichen ersetzt.

Notabene: Attribute, für die kein Datentyp definiert oder für die keine Datentypdefinition gelesen wurde, werden mit dem Datentyp CDATA prozessiert und unterliegen damit nicht dem fünften Normalisierungsschritt.

Praktisch bedeutet das, dass ich mich in der Arbeit mit XML nur auf die Normalisierungsschritte 1 bis 4 verlassen kann, da in den seltensten Fällen Datentypen definiert oder Datentypdefinitionen via Schemata gelesen werden. Glücklicherweise gibt es die XPath-Funktion normalize-space(), die den fünften und für die Arbeit mit Wertelisten notwendigen Normalisierungsschritt durchführt.

Sprich: tokenize(normalize-space(@ADMID), ' ') anstatt tokenize(@ADMID, ' ')