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

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:
Листинг 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>

<xsl:copy-of select="$boolean"/>

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

<xsl:value-of select="$string"/>

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

<xsl:copy-of select="$string"/>

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

<xsl:value-of select="$number"/>

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

<xsl:copy-of select="$number"/>

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

<xsl:value-of select="$node-set"/>

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

<xsl:copy-of select="$node-set"/>

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

<xsl:value-of select="$tree"/>

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

<xsl:copy-of select="$tree"/>

 </xsl:template>

</xsl:stylesheet>

Поделиться с друзьями: