XML - статьи


/A>Иллюстрация предлагаемого подхода


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

Пример 1   Рассмотрим следующее выражение языка XPath: /doc/head/../body

Данное выражение представляет собой путь доступа (location path) и состоит из 4 шагов доступа:

  • На первом шаге выбирается элемент документа, имеющий имя

    doc.

  • На 2-м шаге выбирается дочерний элемент с именем

    head.

  • На 3-м шаге возвращаемся к родительскому элементу элемента

    head.

  • На последнем шаге переходим к дочернему элементу с именем

    body.

  • Заметим, что на 3-м шаге рассматриваемого нами пути доступа имеется обратная ось parent [8] (записанная в терминах сокращенного синтаксиса XPath в виде двух точек). Ввиду того, что в SXML отсутствуют указатели с дочерних узлов на родительские узлы, реализовать стратегию прямолинейного пошагового вычисления данного пути доступа в SXML невозможно, поскольку, имея на входе лишь контекстный узел, невозможно получить никаких сведений об его родительском узле.

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

    • На первом шаге доступа мы, как и прежде, выбираем элемент документа, имеющий имя doc.
    • Допустим, что на 2-м шаге, когда нужно выбрать дочерний элемент с именем head, мы уже каким-то образом знаем, что следующим 3-м шагом потребуется возвращаться по дереву документа обратно, на тот самый узел, который на текущем 2-м шаге является контекстным узлом. Ввиду данного наблюдения, мы поступим более расчетливо: на 2-м шаге доступа не только выберем требуемый дочерний элемент с именем

      head, но также сохраним текущий контекстный узел, поскольку он потребуется при вычислении оси parent на следующем шаге.

    • Благодаря проделанной предварительной подготовке, вычисление оси parent на 3-м шаге доступа теперь сводится к простому извлечению ранее сохраненного узла.
    • Последний шаг вычисляется как обычно: мы выбираем дочерний элемент с именем body.
    • Благодаря анализу вычисляемого пути доступа из примера , содержащего обратную ось, оказалось возможным вычислить его даже при отсутствии указателей с дочерних узлов на родительские узлы в дереве документа. В следующем разделе рассмотренный на данном примере способ вычисления обратных осей формализуется более строго и обобщается в виде алгоритма на случай произвольного выражения языка XPath.



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