<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>
<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
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
копирует в выходящий документ все узлы в порядке просмотра документа вместе с их потомками.
□ Если результатом вычисления является результирующий фрагмент дерева, то он копируется в выходящий документ в неизмененном виде.
Рассмотрим пример.
<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>
<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> Value-of boolean:</xsl:text>
<xsl:value-of select='$boolean'/>
<xsl:text> Copy-of boolean:</xsl:text>