Книга: Технология XSLT

Примеры путей выборки

Примеры путей выборки

Простые шаги выборки:

child::* — выберет все дочерние элементы контекстного узла;

child::comment() — выберет все узлы комментариев контекстного узла;

child::node() — выберет все дочерние узлы контекстного узла вне зависимости от их типа;

child::query — выберет все дочерние элементы контекстного узла, имеющие имя query;

child::xsql:* — выберет все дочерние элементы, которые находятся в пространстве имен, определяемом префиксом xsql;

child::xsql:query — выберет все дочерние элементы query, которые находятся в пространстве имен, определяемом префиксом xsql;

attribute::* — выберет все атрибуты контекстного узла;

attribute::href — выберет атрибут href контекстного узла, если он существует;

parent::* — выберет родительский узел контекстного узла, если тот является элементом, и пустое множество, если родительский узел имеет другой тип, например является корнем дерева;

parent::node() — выберет родительский узел контекстного узла вне зависимости от его типа. Единственный случай, когда этот шаг выберет пустое множество — это когда контекстный узел является корневым узлом документа;

parent::xsl:template — выберет родительский узел, если тот является элементом с именем template и имеет пространство имен с префиксом xsl, иначе выберет пустое множество;

self::* — выберет контекстный узел, если он является элементом и пустое множество узлов, если контекстный узел имеет другой тип;

self:* — выберет все дочерние элементы контекстного узла, принадлежащие пространству имен с префиксом self;

self::text() — выберет контекстный узел, если он является текстовым узлом;

self::node() — выберет контекстный узел вне зависимости от его типа;

self::query — выберет контекстный узел, если он является элементом с именем query, и пустое множество, если контекстный узел имеет другое имя или не является элементом;

preceding::para — выберет все элементы para, которые предшествуют контекстному узлу в порядке просмотра документа;

preceding::comment() — выберет все узлы комментариев, которые предшествуют контекстному узлу в порядке просмотра документа;

preceding-sibling::* — выберет все братские (принадлежащие тому же родителю) элементы контекстного узла, которые предшествуют ему в порядке просмотра документа;

following::processing-instruction('fop') — выберет все узлы инструкций по обработке, которые имеют имя (целевое приложение) "fop" и следуют за контекстным узлом в порядке просмотра документа;

following-sibling::text() — выберет все текстовые узлы, которые являются братьями контекстного узла и следуют за ним в порядке просмотра документа;

descendant::* — выберет все элементы-потомки контекстного узла;

descendant::node() — выберет все узлы-потомки контекстного узла;

descendant::b — выберет все элементы b, являющиеся потомками контекстного узла;

descendant-or-self::* — выберет все элементы-потомки контекстного узла, а также сам контекстный узел, если он также является элементом;

ancestor::* — выберет все элементы, которые являются предками контекстного узла; выбранное множество не будет включать корневой узел, поскольку он не является элементом;

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

ancestor::p — выберет все элементы p, являющиеся предками контекстного узла;

ancestor-or-self::node() — выберет контекстный узел, а также все узлы, являющиеся его предками. Выбранное этим шагом множество будет всегда включать корневой узел;

ancestor-or-self::body — выберет все элементы body, которые являются предками контекстного узла, а также сам контекстный узел, если он является элементом body;

namespace::* — выберет все узлы пространств имен, ассоциированные с контекстным узлом; это множество будет, как минимум, содержать узел пространства имен xml;

namespace::xyz — выберет узел пространства имен, определяемого префиксом xyz; поскольку один префикс может соответствовать только одному пространству, возвращаемое множество будет содержать не более одного узла.

Шаги выборки с предикатами:

child::*[1] — выберет первый дочерний элемент контекстного узла; этот шаг выборки равносилен child::*[position()=1];

child::p[1] — выберет первый дочерний элемент p контекстного узла; этот шаг выборки равносилен child::p[position()=1];

child::*[last()] — выберет последний дочерний узел контекстного узла; этот шаг выборки равносилен child::*[position()=last()];

child::*[last()-1] — выберет предпоследний дочерний узел контекстного узла; этот шаг выборки равносилен шагу child::*[position()=last()]. Если контекстный узел имеет только один дочерний элемент, выбираемое множество будет пустым;

child::p[position() mod 2 = 0] — выберет все четные элементы p;

child::p[position() mod 2 = 1] — выберет все нечетные элементы p;

child::а[2][attribute::name='b'] — Выберет второй дочерний элемент а контекстного узла, если он имеет атрибут name со значением "b";

child::a[attribute::name='b'][2] — выберет второй дочерний элемент а контекстного узла из тех, которые имеют атрибут name со значением "b"; этот шаг выборки отличается от шага выборки в предыдущем примере — порядок следования предикатов имеет значение;

child::a[position()=$i] — выберет дочерний элемент а, позиция которого равна значению переменной i;

parent::*['root'] — выберет родительский узел контекстного узла, если он является элементом; если он является корнем документа, этот шаг выборки не выберет ничего; предикат ['root'] не имеет никакого действия, поскольку строка 'root' как непустая строка тождественно преобразуется в истину;

preceding-sibling::*[attribute::*] — выберет все братские узлы контекстного узла, которые предшествуют ему, являются элементами и содержат, по крайней мере, один атрибут;

preceding-sibling:p[1] — выберет ближайший (первый в обратном порядке просмотра) элемент p, который предшествует контекстному узлу;

following::а[attribute::href][not(descendant::img)] — выберет все узлы, которые следуют за контекстным в порядке просмотра документа, являются элементами с именем а, имеют атрибут href, но не имеют элементов-потомков с именем img;

ancestor::node()[2] — выберет второго предка (то есть "деда") контекстного узла;

descendant-or-self::a[attribute::href] — выберет контекстный узел, а также все узлы-потомки контекстного узла, если они являются элементами с именем а и имеют атрибут href;

namespace::*[contains(self::node(), 'XML')] — выберет узлы пространств имен, которые ассоциируются с контекстным узлом, и строковое значение (URI) которых содержит подстроку 'XML'.

Использование сокращенного синтаксиса в шагах выборки:

table — выберет все дочерние элементы table контекстного узла; этот шаг выборки равносилен child::table;

@* — выберет все атрибуты контекстного узла; полная версия этого шага выборки выглядит как attribute::*;

*[i] — выберет первый дочерний элемент контекстного узла; этот шаг выборки равносилен шагу child::*[position()=1];

*[last()] — выберет последний дочерний узел контекстного узла; этот шаг выборки равносилен шагу child::*[position()=last()];

descendant-or-self::a[@href] — выберет контекстный узел, а также все узлы-потомки контекстного узла, если они являются элементами с именем а и имеют атрибут href; этот шаг выборки эквивалентен шагу descendant-or-self::a[attribute::href]; еще короче его можно записать как .//a[@href];

following::a[@href][not(@target)] — выберет все узлы, которые следуют в порядке просмотра документа за контекстным узлом, являются элементами с именем а, имеют атрибут href, но не имеют атрибута target; этот шаг эквивалентен шагу following::a[attribute::href][not(attribute::target)];

.. — выберет родительский узел контекстного узла; этот шаг выборки эквивалентен шагу parent::node();

namespace::*[contains(., 'XML')] — выберет узлы пространств имен, которые ассоциируются с контекстным узлом, и строковое значение (URI) которых содержит подстроку 'XML'. Этот шаг выборки эквивалентен шагу namespace::*[contains(self::node(), 'XML')];

preceding-sibling::*[@*] — выберет все братские узлы контекстного узла, которые предшествуют ему, являются элементами и содержат, по крайней мере, один атрибут;

*[not(self::para)] — выберет все дочерние элементы контекстного узла, кроме элементов para;

*[para or chapter] — выберет все дочерние элементы контекстного узла, которые имеют хотя бы один дочерний элемент para или chapter;

*[para and chapter] — выберет все дочерние элементы контекстного узла, которые имеют хотя бы один дочерний элемент para и хотя бы один дочерний элемент chapter;

*[para][chapter] — выберет все дочерние элементы контекстного узла, которые имеют хотя бы один дочерний элемент para и хотя бы один дочерний элемент chapter; этот шаг выборки равносилен *[para and chapter], однако в общем случае это неверно;

*[* or @*] — выберет все дочерние элементы, содержащие атрибуты или элементы;

*[not(* or @*)] — выберет все дочерние элементы, не содержащие ни атрибутов, ни элементов;

*[@name or @href] — выберет все дочерние элементы контекстного узла, имеющие хотя бы один из атрибутов name или href;

@*[count(.|../@href) != count(../@href)] — выберет все атрибуты контекстного узла, кроме атрибутов href;

[local-name() != 'href'] — выберет все атрибуты контекстного узла, кроме атрибутов href; это выражение практически аналогично предыдущему (за тем исключением, что в этом способе не учитываются пространства имен).

Примеры путей выборки:

/ — выберет корневой узел документа;

/* — выберет элемент, находящийся в корне документа (элемент документа);

ancestor::body/a — выберет все элементы а, принадлежащие всем предкам-элементам body контекстного узла;

/ancestor::body/a — выберет все элементы а, принадлежащие всем предкам-элементам body корневого узла (это будет пустое множество);

//ancestor::body/a — выберет все элементы а, принадлежащие всем предкам-элементам body корневого узла и потомков корневого узла; иными словами, путь //ancestor::body выбирает элементы body, являющиеся предками каких-либо узлов документа, шаг a — дочерние узлы этих элементов; это выражение равносильно выражению //body[node()]/a;

preceding::а/@b — выберет атрибуты b элементов а, предшествующих контекстному узлу;

/doc/chapter — выберет элементы chapter, принадлежащие элементам doc, которые находятся в корне документа;

//doc/chapter — выберет элементы chapter, которые находятся в любом элементе doc документа;

doc/chapter — выберет элементы chapter, которые находятся в дочерних элементах doc контекстного узла;

self::node()[ancestor::body[1]] — выберет множество, состоящее из контекстного узла, если во множестве его предков body есть первый элемент (иначе — пустое множество); это выражение равносильно выражению self::node()[ancestor::body], поскольку если ancestor::body — непустое множество, то у него будет первый элемент;

*[contains(name(), 'ody')]/*[contains(name(),'able')] — выберет множество элементов, в имени которых присутствует строка "able" при условии, что они принадлежат дочерним элементам контекстного узла, в имени которых присутствует строка "ody";

*[last()]/preceding-sibling::*[2] — выберет второй с конца дочерний элемент контекстного узла. Это выражение равносильно *[last()-2];

*/@* — выберет все атрибуты всех дочерних элементов контекстного узла;

//* [local-name(.) = 'body'] — выберет все элементы body текущего документа вне зависимости от их пространств имен.

Оглавление книги


Генерация: 1.609. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз