XSLT — страница 22 из 124

>
дает указание процессору XSLT обрабатывать все совпадающие шаблоны для дочерних узлов контекстного узла. Элемент
дает возможность явно указать, когда следует закончить обработку дочерних узлов, а это имеет решающее значение при вставке их данных в нужное место в HTML-таблице.

Один важный момент часто вызывает затруднения: элемент

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

В следующем примере мы поместим элемент

туда, куда нам требуется вставить данные из элементов
в таблицу HTML. Я также добавил новый шаблон для обработки элементов
:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>     The Planets Table</code></pre></p><p><pre><code>

     The Planets Table

NameMassRadiusDay

  .

  .

  .

В новом шаблоне, обрабатывающем элементы

, я должен извлечь данные из каждого элемента
, то есть восстановить значения в дочерних элементах элемента
, таких как
,
и т.д.:

Mercury

.0553

58.65

1516

.983

43.4

 .

 .

 .

Это можно сделать при помощи элемента

.

Доступ к значениям узлов

Элемент

записывает в результирующий документ строковое значение выражения; в частности, с его помощью можно возвратить значение узла, которым для элемента будет заключенный в элемент текст. Атрибуту выбора элемента
можно присвоить выражение XPath, задающее узел или набор узлов. В шаблоне, задающем элементы
, обратиться к дочернему элементу
можно при помощи выражения XPath "
child::MASS
". Как мы увидим в главе 4, выражения XPath можно писать разными способами: например, вместо "
child::MASS
" можно просто написать "
MASS
". Таким образом, получить данные дочерних элементов, таких как
,
и т.д., можно следующим способом (листинг 3.1).

Листинг 3.1. Полная версия planets.xsl

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>     The Planets Table</code></pre></p><p><pre><code>

<Н1>

     The Planets Table

NameMassRadiusDay


Создание образцов выбора

Как вы могли ожидать, исходя из того, что "

child::MASS
" можно представить в виде "
MASS
" и применения шаблонов, таких как "
/
", "
/PLANETS
" и т.д., вплотную познакомиться с созданием образцов выбора не так-то просто — этому посвящена вся глава 4.

Образцы выбора (match pattern) являются подмножеством полного языка XPath, их можно использовать в элементах

>,
и
. В частности, в образец можно установить атрибут match у
и
, и атрибуты
count
и
from
элемента
. В следующем списке приведен ряд примеров образцов выбора, много других примеров будет показано в главе 4 при подробном обсуждении использования XPath для выбора узлов и атрибутов:

• "

/
" выбирает корневой узел;

• "

*
" выбирает элементы узлов (но не всех узлов, как зачастую ошибочно полагают);

• "

PLANET
" выбирает элементы
;

• "

PLANET/MASS
" выбирает все элементы
, дочерние для элемента
;

• "

//PLANET
" выбирает все элементы
, производные от корневого узла;

• "

.
" выбирает текущий узел (технически это не образец выбора, а выражение XPath, как мы увидим в главе 7).

Образцы можно также использовать в атрибуте

select
элементов
,
,
,
и
; фактически атрибут
select
этих элементов может содержать полные выражения XPath, а не только образцы выбора. Атрибут