KnigaRead.com/

Алексей Валиков - Технология XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Алексей Валиков, "Технология XSLT" бесплатно, без регистрации.
Перейти на страницу:

□ 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 текущего документа вне зависимости от их пространств имен.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*