Чтение онлайн

на главную - закладки

Жанры

Холзнер Стивен

Шрифт:

Элемент <xsl:element>: создание новых элементов на этапе выполнения

Новые элементы можно создавать при помощи элемента <xsl:element>, который очень удобен для задания имени нового элемента на этапе выполнения.

У этого элемента три атрибута:

• 

name
(обязательный). Имя создаваемого элемента. Принимает значение шаблона значений атрибута, возвращающего
QName
;

• 

namespace
(необязательный). URI пространства имен нового элемента. Принимает значение шаблона значений атрибута, возвращающего URI;

• 

use-attribute-sets
(необязательный). Задает наборы атрибутов, содержащие атрибуты этого элемента. Принимает значение списка элементов
QName
, разделенных символами-разделителями.

Элемент

<xsl:element>
содержит тело шаблона.

Пусть, например, мне нужно хранить названия планет в атрибутах

NAME
, а не в элементе
<NAME>
в
planets.xml
:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="#"?>

<PLANETS>

 <PLANET NAME="Mercury">

<MASS UNITS="(Earth = 1)">.0553</MASS>

<DAY UNITS="days">58.65</DAY>

<RADIUS UNITS="miles">1516</RADIUS>

<DENSITY UNITS="(Earth = 1)">.983</DENSITY>

<DISTANCE UNITS="million miles">43.4</DISTANCE><!--В перигелии-->

 </PLANET>

 .

 .

 .

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

<Mercury>
,
<Venus>
и
<Earth>

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xml" href="#"?>

<PLANETS>

 <Mercury>

<MASS UNITS="(Earth = 1)">.0553</MASS>

<DAY UNITS="days">58.65</DAY>

<RADIUS UNITS="miles">1516</RADIUS>

<DENSITY UNITS="(Earth = 1)">.983</DENSITY>

<DISTANCE UNITS="million miles">43.4</DISTANCE><!--В перигелии-->

 </Mercury>

 .

 .

 .

В этом случае я не знаю имени выходного элемента до времени выполнения, потому и не могу просто применить элемент буквального результата. Я мог бы скомпоновать новый элемент, трактуя его как текст (что и показано в примере ниже, где я вывожу символы, подобные «<», при помощи атрибута

disable-output-escaping
элемента
<xsl:text>
): 

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:output method="xml"/>

 <xsl:template match="@*|node">

<xsl:copy>

<xsl:apply-templates select="@*|node"/>

</xsl:copy>

 </xsl:template>

 <xsl:template match="PLANET">

<xsl:text disable-output-escaping="yes">&lt;</xsl:text>

<xsl:value-of select="@NAME"/>

<xsl:text disable-output-escaping="yes">&gt;</xsl:text>

<xsl:apply-templates/>

<xsl:text disable-output-escaping="yes">&lt;/</xsl:text>

<xsl:value-of select="@NAME"/>

<xsl:text disable-output-escaping="yes">&gt;</xsl:text>

 </xsl:template>

</xsl:stylesheet>
 

Но это грубый способ, при котором разметка рассматривается как простой текст. С другой стороны, зная название планеты, я могу создать новый элемент при помощи <xsl:element> (листинг 6.6), получив название новой планеты из атрибута

NAME
следующим образом.

Листинг 6.6. Применение <xsl:element>

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:output method="xml"/>

 <xsl:template match="@*|node">

<xsl:copy>

<xsl:apply-templates select="@*|node"/>

</xsl:copy>

 </xsl:template>

 <xsl:template match="PLANET">

<xsl:element name="{@NAME}">

Поделиться:
Популярные книги

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Кодекс Охотника. Книга XXXVII

Винокуров Юрий
37. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVII

Эволюционер из трущоб. Том 7

Панарин Антон
7. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 7

Т. 03 Гражданин Галактики

Хайнлайн Роберт Энсон
3. Отцы-основатели. Весь Хайнлайн
Фантастика:
научная фантастика
7.00
рейтинг книги
Т. 03 Гражданин Галактики

Ученик. Книга третья

Первухин Андрей Евгеньевич
3. Ученик
Фантастика:
фэнтези
7.64
рейтинг книги
Ученик. Книга третья

Атаман царского Спецназа

Корчевский Юрий Григорьевич
Боевая фантастика Ю. Корчевского
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.00
рейтинг книги
Атаман царского Спецназа

Кондотьер

Листратов Валерий
7. Ушедший Род
Фантастика:
фэнтези
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Кондотьер

Адепт. Том второй. Каникулы

Бубела Олег Николаевич
7. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.05
рейтинг книги
Адепт. Том второй. Каникулы

Deus vult

Рокотов Алексей
3. Путь князя
Фантастика:
фэнтези
рпг
попаданцы
5.00
рейтинг книги
Deus vult

Жизнь коротка

Желязны Роджер Джозеф
Классика мировой фантастики
Фантастика:
социально-философская фантастика
научная фантастика
боевая фантастика
космическая фантастика
7.33
рейтинг книги
Жизнь коротка

Ваше Сиятельство 5

Моури Эрли
5. Ваше Сиятельство
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Ваше Сиятельство 5

Сердце зимы

Джордан Роберт
9. Колесо Времени
Фантастика:
фэнтези
8.73
рейтинг книги
Сердце зимы

Неучтенный элемент. Том 2

NikL
2. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 2

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4