В XPath существует два вида путей выборки — относительные и абсолютные пути. Абсолютный путь (например, " /Java/Doc/ClassGenerator
") начинается ведущей косой чертой (" /
") и отсчитывается от корневого узла документа, в то время как относительный путь (например, " Doc/XMLParser
") отсчитывается от контекстного узла.
И абсолютный, и относительный пути выборки состоят из нескольких шагов выборки , разделенных косой чертой (" /
"). Вычисление пути выборки производится последовательным выполнением составляющих его шагов. В случае абсолютного пути выборки, первый шаг выполняется относительно корневого узла дерева, в случае относительного пути — относительно контекстного узла контекста.
Пример
В файловой системе выполнить путь вида Lib/Servlets/classes
означает:
□ из текущего каталога перейти в подкаталог Lib
;
□ затем перейти в подкаталог Servlets
;
□ и наконец — в подкаталог classes
.
Для того чтобы выполнить такой же путь выборки в XML-документе, нужно
сделать следующее:
□ выполнить первый шаг, " Lib
" — выбрать все дочерние элементы контекстного узла, имеющие имя " Lib
";
□ затем выполнить шаг " Servlets
" — для каждого из узлов, выбранных предыдущим шагом, выбрать дочерние элементы " Servlets
" и объединить их в одно множество;
□ наконец, выполнить шаг " classes
" — для каждого из узлов, выбранных на предыдущем этапе, выбрать дочерние элементы classes
и объединить их в одно множество.
Опишем более подробно алгоритм вычисления пути выборки:
□ если путь выборки является абсолютным путем, то первый его шаг выполняется в контексте корневого узла документа, который содержит контекстный узел;
□ если путь выборки является относительным путем, то первый его шаг выполняется относительно контекстного узла;
□ каждый последующий шаг пути выборки выполняется для каждого узла множества, выбранного на предыдущем шаге, — таким образом выбирается несколько множеств, которые затем объединяются — это и есть множество, выбранное на текущем шаге.
Пример
Рассмотрим процесс выполнения пути выборки /A/B/D/G/I
в следующем документе:
На рис. 6.2 показано логическое дерево, соответствующее этому документу.
Рис. 6.2. Логическое дерево, представляющее XML-документ
Для того чтобы лучше понять процесс выбора, проследим по шагам за тем, как будет обрабатываться этот путь.
1. Данный путь (рис. 6.3) является абсолютным путем выборки, значит, он должен выполняться, начиная от корневого узла.
Рис. 6.3. Начальный узел пути выборки
2. Первым шагом пути (рис. 6.4) является шаг A
, который выбирает все дочерние элементы A
контекстного узла.
Рис. 6.4. Первый шаг
3. Вторым шагом пути (рис. 6.5) является шаг B
, который выбирает все дочерние элементы в узлов множества, выбранного на предыдущем шаге. Так как тогда был выбран единственный узел A
, текущий шаг выберет два дочерних элемента в этого узла.
Рис. 6.5. Второй шаг
4. На очередном шаге (рис. 6.6) мы выбираем дочерние элементы D
. Как можно заметить, один из элементов в, выбранных на прошлом этапе, не содержит таких элементов, значит, в этом случае, шаг выборки возвратит пустое множество. Второй элемент B
имеет три дочерних элемента B
. В итоге мы получим множество, состоящее из трех элементов D
.
Рис. 6.6. Третий шаг
5. Следующий шаг, G
(рис. 6.7) выбирает дочерние элементы G
. Первый элемент D
, выбранный на прошлом шаге, включает один элемент G
, второй не имеет таких элементов, третий — имеет три дочерних элемента G
. Таким образом, на данном шаге будет выбрано множество, состоящее из четырех элементов G
.
Рис. 6.7. Четвертый шаг
Читать дальше