Алексей Валиков - Технология XSLT Страница 22
Алексей Валиков - Технология XSLT читать онлайн бесплатно
Существует множество способов графического изображения деревьев. Мы будем рисовать их так, что корень дерева будет находиться наверху, а поддеревья будут упорядочены слева направо. Такой способ является довольно стандартным для XML, хотя и здесь существует множество вариантов. Примером изображения дерева может быть следующий рисунок (рис. 3.2):
Рис. 3.2. Изображение дерева
Мы часто будем говорить о дочерних узлах, родительских узлах, братских узлах, узлах-предках и узлах-потомках. Дадим определения этим понятиям.
□ Дочерним узлом текущего узла называется любой из корней его поддеревьев. Например, в дереве на рис. 3.2 дочерними узлами узла а являются узлы b и с, а дочерними узлами узла b — узлы d и e. Узел с не имеет дочерних узлов — такие узлы иначе называются листьями.
□ Каждый узел называется родительским узлом корней своих поддеревьев. На рис. 3.2 узел а является родителем узлов b и с, а узел b — родителем узлов d и e.
□ Корни поддеревьев называются братскими узлами или узлами-братьями. На рис. 3.2 братьями являются узлы b и с, а также узлы d и e.
□ Предками текущего узла являются его родитель, а также родители его родителей и так далее. На рис. 3.2 предками узла d являются узлы b и а.
□ Потомками текущего узла являются его дочерние узлы, а также дочерние узлы его дочерних узлов и так далее. На рис. 3.2 потомками узла а являются узлы b, c, d и e.
Узлы дерева XML-документа
Корневой узел
Корневой узел XML-документа — это узел, который является корнем дерева документа. Не следует путать его с корневым элементом документа, поскольку помимо корневого элемента дочерними узлами корня также являются инструкции по обработке и комментарии, которые находятся вне корневого элемента.
Мы будем помечать корневой узел документа символом "/" и изображать следующим образом (рис. 3.3):
Рис. 3.3. Изображение корневого узла
На рис. 3.4 показано изображение документа,
<!--А-->
<В/>
<?С?>
корневой узел которого помимо корневого элемента содержит комментарии и инструкции по обработке.
Рис. 3.4. XML-документ и его изображение
Корневой элемент не имеет имени. Функция name(/) будет всегда возвращать пустую строку.
Строковым значением корневого узла является конкатенация строковых значений всех его текстовых потомков в порядке просмотра документа.
Узлы элементов
Каждому элементу XML-документа соответствует узел элемента. Дочерними узлами узла элемента могут быть узлы его дочерних элементов, а также узлы комментариев, инструкций по обработке и текстовые узлы, которые представляют его непосредственное содержимое. Следует обратить внимание на то, что узлы атрибутов не считаются дочерними узлами своего элемента, они лишь только ассоциируются с ними.
При изображении деревьев мы будем помечать узлы элементов их именами. Например, элемент A будет изображен следующим образом (рис. 3.5):
Рис. 3.5. Изображение элемента А
Каждый элемент имеет расширенное имя, которое состоит из локальной части и идентификатора пространства имен. Пространство имен, которому принадлежит элемент, может быть нулевым, если элемент не имеет префикса, и в его предках не было объявлено пространство имен по умолчанию.
Подобно корневому узлу, строковым значением узла элемента будет конкатенация значений его текстовых потомков в порядке просмотра документа. В силу того, что атрибуты не являются потомками элементов, их текстовые значения учитываться не будут.
Узлы атрибутов
Атрибутам того или иного элемента соответствуют узлы атрибутов. Считается, что узел элемента является родителем узла своего атрибута, но вместе с тем узел атрибута не является дочерним узлом узла его элемента. Такая ситуация несколько отличает дерево документа в XSLT от классического дерева, как оно было определено ранее — отношение между узлом элемента и узлом атрибута является отношением ассоциации. Говорят, что узел атрибута ассоциируется с узлом элемента.
Между тем, отношения такого рода не сильно отличаются от отношений между родительскими и дочерними узлами — один атрибут ассоциируется ровно с одним элементом. Поэтому мы будем изображать узлы атрибутов точно так же, как если бы они были дочерними узлами элементов. Для того чтобы отличать узлы атрибутов от остальных узлов, мы будем помечать их именем, которому будет предшествовать символ "@". При необходимости, значение атрибута будет приводиться в нижней части изображения узла.
ПримерРис. 3.6 показывает возможные варианты изображения элемента, определенного как <file name="a.txt"/>.
Рис. 3.6. Изображение элемента и принадлежащего ему атрибута
В случаях, когда значение атрибута не является важным, оно может отсутствовать в изображении узла.
Каждый атрибут имеет расширенное имя, состоящее из локальной части и идентификатора пространства имен. Пространство имен атрибута будет нулевым, если оно не было определено по умолчанию и у имени атрибута нет префикса.
Строковым значением узла атрибута является значение атрибута, который ему соответствует.
Текстовые узлы
Символьные данные, содержащиеся в документе, организуются в виде текстовых узлов. Последовательности символов, встречающиеся в документах, в целях экономии никогда не разбиваются на два или более текстовых узла, а текстовые узлы никогда не бывают пустыми. Содержание секций CDATA обрабатываются так, как если бы их содержимое было просто включено в документ с заменой символов "<" и "&", на сущности < и &.
Текст, содержащийся в значениях атрибутов, а также в комментариях и инструкциях по обработке не оформляется в виде текстовых узлов — эти данные принадлежат соответствующим узлам атрибутов, комментариев и инструкций.
Мы будем помечать текстовые узлы символьными последовательностями, которые они содержат, заключенными в кавычки. В случаях, когда сам текст не важен, мы будем помечать эти узлы как "...".
ПримерЭлемент, заданный как <p>Welcome</p>, может быть изображен следующим образом (рис. 3.7):
Рис. 3.7. Варианты изображения текстового узла элемента
Текстовые узлы не имеют имен. Строковым значением текстового узла является последовательность символов, которую он содержит.
Узлы пространств имен
Каждому пространству имен, которое определено для данного элемента, соответствует узел пространства имен, ассоциируемый с узлом этого элемента. Множество узлов пространств имен, которое ассоциируется с данным элементом, включает в себя следующие узлы.
□ Узел, который соответствует пространству имен xml. Это пространство неявно определено в любом XML-документе.
□ Узел, который соответствует пространству имен, заданному по умолчанию, если такое есть.
□ По одному узлу на каждый префикс пространств имен, доступный в данном элементе.
Напомним, что пространства имен, доступные в данном элементе, и пространство имен по умолчанию могут быть определены в его предках.
Подобно узлам атрибутов, узлы пространств имен ассоциируются с узлом элемента. Узел элемента является их родительским узлом, но при этом они сами не являются дочерними узлами узла элемента.
Расширенные имена узлов пространств имен состоят из локальной части имени, которая равна префиксу, использованному для объявления этого пространства и нулевого идентификатора пространства имен. Локальная часть пространства, определенного по умолчанию, будет пустой.
Строковым значением узла пространства имен является уникальный идентификатор ресурса (URI), с которым оно связано.
Мы будем помечать узлы пространств имен метками вида xmlns:префикс для обычного пространства и xmlns для пространства имен по умолчанию. Мы не будем показывать в деревьях узлы пространства имен xml, поскольку они ассоциируются со всеми узлами элементов. При необходимости в нижней части изображения узла мы будем приводить URI пространства, которое ему соответствует.
ПримерПриведем изображение дерева (рис. 3.8) документа
Жалоба
Напишите нам, и мы в срочном порядке примем меры.