Листинг 3.9. Таблица стилей, копирующая элементы

<?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='*'>

  <xsl:copy>

   <xsl:apply-templates/>

  </xsl:copy>

 </xsl:template>

</xsl:stylesheet>

Однако <xsl:copy> не копирует атрибуты — вот результат применения этой таблицы стилей к planets.xml:

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

<PLANETS>

 <PLANET>

  <NAME>Mercury</NAME>

  <MASS>.0553</MASS>

  <DAY>58.65</DAY>

  <RADIUS>1516</RADIUS>

  <DENSITY>.983</DENSITY>

  <DISTANCE>43.4</DISTANCE>

 </PLANET>

 <PLANET>

  <NAME>Venus</NAME>

  <MASS>.815</MASS>

  <DAY>116.75</DAY>

  <RADIUS>3716</RADIUS>

  <DENSITY>.943</DENSITY>

  <DISTANCE>66.8</DISTANCE>

 </PLANET>

 <PLANET>

  <NAME>Earth</NAME>

  <MASS>1</MASS>

  <DAY>1</DAY>

  <RADIUS>2107</RADIUS>

  <DENSITY>1</DENSITY>

  <DISTANCE>128.4</DISTANCE>

 </PLANET>

</PLANETS>

Копирование атрибутов несколько сложнее, потому что нужно найти какой-либо способ применить <xsl:copy> к каждому атрибуту элемента. Это можно сделать, например, при помощи элемента <xsl:for-each>, о котором пойдет речь в главе 5.

Листинг 3.10. Копирование атрибутов

<?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='*'>

  <xsl:copy>

   <xsl:for-each select='@*'>

    <xsl:copy/>

   </xsl:for-each>

   <xsl:apply-templates/>

  </xsl:copy>

 </xsl:template>

</xsl:stylesheet>

А вот результат — заметьте, что на этот раз атрибуты не затронуты:

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

<PLANETS>

 <PLANET>

  <NAME>Mercury</NAME>

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

 <PLANET>

  <NAME>Venus</NAME>

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

 </PLANET>

 <PLANET>

  <NAME>Earth</NAME>

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

 </PLANET>

</PLANETS>

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

ГЛУБОКОЕ КОПИРОВАНИЕ

Пример использования <xsl:copy> для осуществления глубокого копирования документа будет приведен в главе 4, в которой описывается функция узла и объясняется, как рекурсивно вызывать один и тот же шаблон.

Элемент <xsl:copy-of>

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

0

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

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