Листинг 7.18. Шаблон преобразования

<xsl:template match='@*|node()'>

 <xsl:copy>

  <xsl:attribute name='element-count'>

   <xsl:value-of select='count(*) '/>

  </xsl:attribute>

  <xsl:apply-templates select='@*|node()'/>

 </xsl:copy>

</xsl:template>

Листинг 7.19. Выходящий элемент

<a element-count='3'>

 text

 <b element-count='0' attr='value'/>

 <c element-count='0'/>

 <d element-count='1'>

  text

  <e element-count='0'/>

 </d>

</a>

Если xsl:copy используется для создания в выходящем документе копии узла элемента, в него при помощи атрибута use-attribute-sets могут быть также включены именованные наборы атрибутов (см. раздел 'Именованные наборы атрибутов' данной главы).

Пример

Предыдущее преобразование может быть переписано в виде

<xsl:attribute-set name='elements'>

 <xsl:attribute name='element-count'>

  <xsl:value-of select='count(*)'/>

 </xsl:attribute>

</xsl:attribute-set>

<xsl:template match='@*|node()'>

 <xsl:copy use-attribute-sets='elements'>

  <xsl:apply-templates select='@*|node()'/>

 </xsl:copy>

</xsl:template>

Результат преобразования будет абсолютно идентичен выходящему документу, полученному в предыдущем примере.

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

Синтаксис элемента несложен:

<xsl:copy-of

 select='выражение'/>

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

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

□ Если результатом вычисления выражения является множество узлов (node-set), то xsl:copy-of копирует в выходящий документ все узлы в порядке просмотра документа вместе с их потомками.

□ Если результатом вычисления является результирующий фрагмент дерева, то он копируется в выходящий документ в неизмененном виде.

Рассмотрим пример.

Листинг 7.20. Входящий документ

<values>

 <boolean>false</boolean>

 <string>text</string>

 <number>3.14</number>

 <node-set>

  <item>10</item>

  <item>20</item>

  <item>30</item>

 </node-set>

 <tree>

  text

  <root>

   text

   <branch>

    text

    <leaf/>

    <leaf/>

   </branch>

   <leaf/>

  </root>

 </tree>

</values>

Листинг 7.21. Преобразование

<xsl:stylesheet

 version='1.0'

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

 <xsl:template match='/'>

  <xsl:variable name='boolean' select='values/boolean='true''/>

  <xsl:variable name='string' select='string(values/string)'/>

  <xsl:variable name='number' select='number(values/number)'/>

  <xsl:variable name='node-set' select='values/node-set/*'/>

  <xsl:variable name='tree'>

   <xsl:copy-of select='values/tree/*'/>

  </xsl:variable>

  <xsl:text>&#10;Value-of boolean:</xsl:text>

  <xsl:value-of select='$boolean'/>

  <xsl:text>&#10;Copy-of boolean:</xsl:text>

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

0

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

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