Языки информационного обмена

       

Прямой конструктор элемента


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

В прямом конструкторе, в содержимом конструируемого элемента, можно записать выражение в фигурных скобках. Оно будет вычислено, а результат вычисления подставлен в конструируемый элемент. Например:

<аgе>{10 + 20 }</аgе>

Заметьте, что если не написать фигурные скобки, то выражение не будет вычисляться, а попадет в конструируемый элемент как простой текст.

Если фигурные скобки надо понимать как простые символы, а не как команду вычисления выражения, то их следует удваивать.

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

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

В полученной после этого новой последовательности нет атомарных значений, а есть только узлы.

Затем все содержимое конструируемого элемента представляется одной последовательностью узлов, составленной из текстовых узлов конструктора, последовательностей, полученных после вычисления и преобразования выражений, и вложенных узлов-элементов, полученных после рекурсивной обработки вложенных в конструктор элементов. В этой последовательности не должно быть корневых узлов документа, а все узлы-атрибуты должны находиться в начале последовательности. Если эти условия не выполнены, то конструктор выдаст сообщение об ошибке и прекратит работу. Если же они выполнены, то конструктор сделает еще один шаг: он сольет все идущие подряд текстовые узлы, не оставляя между ними пробелов, в один текстовый узел.

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

В атрибутах конструктора тоже можно записать выражения в фигурных скобках, например:

<person id="92-3456" sex="{ /notion/sex[1]}">

Выражение вычисляется, каждый элемент полученной последовательности представляется строкой, а строки разделяются пробелами. Кроме выражений, значение атрибута может содержать наборы символов, которые сцепляются со строками, полученными из выражений, без всяких пробелов:

<person id="9{l + 1}-3456" sex="male">



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