Книга: Технология 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
текущего документа вне зависимости от их пространств имен.
- Пути выборки
- Ограничение результатов выборки FIRST
- Примеры получения статистики
- Примеры
- 1. Унарная операция выборки
- 1. Операция выборки.
- 4.11.2. Примеры добавления ipchains-правил
- 4.11.3. Примеры удаления ipchains-правил
- 4.12.3. Примеры конфигурирования iptables
- Примеры концептуальных положений и целей проекта
- Примеры творческих промоакций
- Таблица 14.1. Примеры имен файлов в результате задания правил форматирования