Изменение структуры документа на основе входных данных
До сих пор созданные мной шаблоны основывались на определенном жестком скелете, точно задающем, что должно попасть в выходной документ и в каком порядке. Но при помощи таких элементов XSLT, как
<xsl:element>
,
<xsl:attribute>
,
<xsl:text>
и т.д., можно создавать новые узлы в рабочем порядке, на основе данных входного документа.
У вас уже есть небольшой опыт в этой области, поскольку мы работали с шаблонами значений атрибутов в главе 3. Как вы помните, при помощи таких шаблонов можно присвоить атрибуту значение выражения XPath,
если заключить это выражение в фигурные скобки, { и }. Например, чтобы установить атрибут
NAME
в строковое значение элемента
<DESCRIPTION>
, дочернего элемента контекстного узла, это значение можно присвоить так:
NAME={DESCRIPTION}
. Теперь мы можем более подробно рассмотреть всю тему создания новых элементов и атрибутов «с ходу», начав с
<xsl:element>
.
Элемент <xsl:element>: создание новых элементов на этапе выполнения
Новые элементы можно создавать при помощи элемента <xsl:element>, который очень удобен для задания имени нового элемента на этапе выполнения.
У этого элемента три атрибута:
•
name
(обязательный). Имя создаваемого элемента. Принимает значение шаблона значений атрибута, возвращающего
QName
;
•
namespace
(необязательный). URI пространства имен нового элемента. Принимает значение шаблона значений атрибута, возвращающего URI;
•
use-attribute-sets
(необязательный). Задает наборы атрибутов, содержащие атрибуты этого элемента. Принимает значение списка элементов
QName
, разделенных символами-разделителями.
Элемент
<xsl:element>
содержит тело шаблона.
Пусть, например, мне нужно хранить названия планет в атрибутах
В этом случае я не знаю имени выходного элемента до времени выполнения, потому и не могу просто применить элемент буквального результата. Я мог бы скомпоновать новый элемент, трактуя его как текст (что и показано в примере ниже, где я вывожу символы, подобные «<», при помощи атрибута
Но это грубый способ, при котором разметка рассматривается как простой текст. С другой стороны, зная название планеты, я могу создать новый элемент при помощи <xsl:element> (листинг 6.6), получив название новой планеты из атрибута