The Planets Table
The Planets Table
Name |
Mass |
Radius |
Day |
Earth |
1 (Earth = 1) |
2107 miles |
1 days |
При помощи операции Or (или), |, можно осуществлять выбор по нескольким возможным образцам, что очень удобно с ростом сложности документов. В следующем примере я хочу отобразить элементы и полужирным, что задается тегом HTML <���В>
. Для выбора либо элементов , либо в новом правиле я использую операцию Or:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.
.
.
|
|
|
|
Вот результаты; заметьте, что значения имени и массы заключены в элементы <���В>
:
The Planets Table
.
.
.
Mercury |
.0553 |
1516 miles |
58.65 days |
Venus |
.815 |
3716 miles |
116.75 days |
Earth |
1 |
2107 miles |
1 days |
Операцию | можно применять к любым допустимым образцам — например, в таких выражениях, как " PLANET|PLANET//NAME
"; можно использовать несколько операций | — например, " NAME|MASS|DAY
" и т.п.
Изучать образцы лучше всего на примерах. Предположим, что нам требуется преобразовать planets.xml
в planets.html
, но сохранить только первую планету, Меркурий. Это можно сделать при помощи предиката [position()<2]
, так как позиция первой планеты равна 1, следующей — 2, и т.д. Заметьте, однако, что <; является управляющим символом для процессоров XSLT, начинающим разметку, поэтому вместо < необходимо использовать <
. И отметьте, что для того чтобы убрать из planets.xml
другие элементы, для них нужно предоставить пустой шаблон, что можно сделать при помощи предиката [position()>=2]
(листинг 4.10).
Листинг 4.10. Выбор только Меркурия
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planets Table
The Planets Table
|
|
|
|
Вот результирующий документ — отметьте, что сохранилась только первая планета, Меркурий:
The Planets Table
The Planets Table
Name |
Mass |
Radius |
Day |
Mercury |
.0553 (Earth = 1) |
1516 miles |
58.65 days |
В следующем примере в элемент Земли были добавлены атрибуты COLOR
(цвет) и POPULATED
(населена):
Earth
1
1
2107
1
1284
Как выбрать только элементы, имеющие оба атрибута, COLOR
и POPULATED
? Можно применить предикат " [@COLOR and @POPULATED]
". Чтобы убрать другие элементы — так, чтобы правило по умолчанию не поместило их текст в результирующий документ, — можно применить предикат " [not(@COLOR) or not(@POPULATED)]
", как показано в листинге 4.11.
Листинг 4.11. Выбор только элементов с двумя атрибутами COLOR и POPULATED
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Colorful, Populated Planets
Colorful, Populated Planets
|
|
|
|
А вот результат:
Colorful, Populated Planets
Colorful, Populated Planets
Name |
Mass |
Radius |
Day |
Earth |
1 (Earth = 1) |
2107 miles |
1 days |
Этот документ показан на рис. 4.3.
Рис. 4.3.Применение предикатов XPath для проверки атрибутов
В следующем примере я копирую planets.xml
в новый XML-документ и изменяю текст в элементе Венеры на " The Planet of Love
" (планета любви). Для этого я сначала копирую в результирующий документ все узлы и атрибуты:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
.
.
.
Теперь я добавлю новое правило, выбирающее элементы с текстом " Venus
" (Венера) по образцу " NAME[text()='Venus']
". Хотя элементы удовлетворяют обоим правилам этой таблицы стилей, правило с образцом " NAME[text()='Venus']
" осуществляет более узкий выбор, поэтому для элемента Венеры процессор XSLT применит его:
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
The Planet of Love
И вот результат:
Mercury
.0553
58.65
1516
.983
43.4
The Planet of Love
.815
116.75
3716
.943
66.8
Earth
1
1
2107
1
128.4
В действительности, в выражениях XPath можно ссылаться на контекстный узел при помощи ".", и значением по умолчанию для узла является его текст, поэтому следующее правило работает точно так же:
Читать дальше