Расширяемый язык разметки

Нормализация значения атрибута


Перед передачей значения атрибута приложению или проверкой его корректности XML процессор должен выполнить нормализацию полученного значения атрибута по описанному далее алгоритму либо как-нибудь иначе, например передав это значение отдельному приложению, реализующему указанный алгоритм.

Все концы строк при выводе должны быть приведены к #xA, как было описано в главе , поэтому остальная часть данного алгоритма оперирует текстом, уже нормализованным подобным образом.

Начинается с нормализованного значения, состоящего из пустой строки.

Для каждого символа, ссылки на сущность и ссылки на символ в ненормализованном значении атрибута, с первого до последнего, должны выполняться следующие действия:

    Для ссылки на символ к нормализованное значение поместить символ, на который делалась ссылка.

    Для ссылки на сущность над текстом замены для указанной сущности рекурсивно выполнять третий шаг обсуждаемого алгоритма.

    В случае пробельного символа (#x20, #xD, #xA, #x9) в нормализованное значение помещать символ пробела (#x20).

    Остальные символы просто помещать в нормализованное значение.

    Если тип атрибута - не CDATA, то следующим шагом XML процессор должен обработать нормализованное значение атрибута, отбросив начальные и заключительные символы пробела (#x20), а также заменив любую встреченную последовательность пробелов (#x20) одним символом пробела (#x20).

    Заметим, что если ненормализованное значение атрибута имело ссылку на пробельный символ, иной нежели символ пробела (#x20), то его нормализованное значение будет содержать сам символ, на который делалась ссылка (т.е. #xD, #xA или #x9). Это иной случай, чем когда в ненормализованном значении атрибута обнаружен пробельный символ (а не просто ссылка на него), который в нормализованном значении будет заменен символом пробела (#x20), а также когда в ненормализованном значении имеется ссылка на сущность, чей текст замены содержит пробельный символ, который в ходе рекурсивной обработки тоже будет заменен в нормализованном значении пробелом (#x20).


    Все атрибуты, для которых не было представлено декларации, должна обрабатываться непроверяющим процессором так, как если бы были декларированы CDATA.



    Далее следуют примеры нормализации атрибутов. Даны следующие декларации:

    <!ENTITY d "&#xD;"> <!ENTITY a "&#xA;"> <!ENTITY da "&#xD;&#xA;">
    Атрибут, указанный в левой колонке следующей таблицы, в ходе нормализации будет преобразован в последовательность символов, представленную в средней колонке, если атрибут a был декларирован как NMTOKENS, или же в последовательность символов из правой колонки, если a декларирован как CDATA.

    Спецификация атрибута

    a является NMTOKENS

    a является CDATA
    a="

    xyz"
    x y z #x20 #x20 x y z
    a="&d;&d;A&a;&a;B&da;"
    A #x20 B #x20 #x20 A #x20 #x20 B #x20 #x20
    Заметим, что последний пример недействителен (хотя и корректен), если объявлено, что a имеет тип NMTOKENS.


    Содержание раздела






    a= "&#xd;&#xd;A&#xa;&#xa;B&#xd;&#xa;"
    #xD #xD A #xA #xA B #xD #xA #xD #xD A #xA #xA B #xD #xD