<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}'>

   <xsl:apply-templates/>

  </xsl:element>

 </xsl:template>

</xsl:stylesheet>

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

<?xml version='1.0' encoding='UTF-8'/>

<?xml-stylesheet type='text/xml' href='planets.xsl'?>

<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><!--B перигелии-- >

 </Mercury>

 <Venus>

  <MASS UNITS='(Earth = 1)'>.815</MASS>

  <DAY UNITS='days'>116.75</DAY>

  <RADIUS UNITS='miles'>3716</RADIUS>

  <DENSITY UNITS='(Earth = 1)'>.943</DENSITY>

  <DISTANCE UNITS='million miles'>66.8</DISTANCE><!--B перигелии-- >

 </Venus>

 <Earth>

  <MASS UNITS='(Earth = 1)'>1</MASS>

  <DAY UNITS='days'>1</DAY>

  <RADIUS UNITS='miles'>2107</RADIUS>

  <DENSITY UNITS='(Earth = 1)'>1</DENSITY>

  <DISTANCE UNITS='million miles'>128.4</DISTANCE><!--B перигелии-- >

 </Earth>

</PLANETS>

Таким способом можно создавать новые элементы и задавать им имя во время преобразования XSLT.

Элемент <xsl:attribute>: создание новых атрибутов

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

У элемента два атрибута:

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

• namespace (необязательный). Пространство имен нового атрибута. Устанавливается в URI.

Этот элемент содержит в себе тело шаблона, которое устанавливает значение атрибута.

В листинге 6.7 я создаю новые элементы <PLANET> с атрибутами, которые соответствуют различным названиям планет (значения берутся из атрибута COLOR исходных элементов <PLANET>).

Листинг 6.7. Применение <xsl:attribute>

<?xml version='1.0'?>

<xsl:stylesheet version='1.0'

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

 <xsl:template match='PLANETS'>

  <HTML>

   <HEAD>

    <TITLE>

     Planets

    </TITLE>

   </HEAD>

   <BODY>

    <xsl:apply-templates select='PLANET'/>

   </BODY>

  </HTML>

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату