Валиков Алексей Н.
Шрифт:
Использование элемента
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> Value-of boolean:</xsl:text>
<xsl:value-of select="$boolean"/>
<xsl:text> Copy-of boolean:</xsl:text>
<xsl:copy-of select="$boolean"/>
<xsl:text> Value-of string:</xsl:text>
<xsl:value-of select="$string"/>
<xsl:text> Copy-of string:</xsl:text>
<xsl:copy-of select="$string"/>
<xsl:text> Value-of number:</xsl:text>
<xsl:value-of select="$number"/>
<xsl:text> Copy-of number:</xsl:text>
<xsl:copy-of select="$number"/>
<xsl:text> Value-of node-set:</xsl:text>
<xsl:value-of select="$node-set"/>
<xsl:text> Copy-of node-set:</xsl:text>
<xsl:copy-of select="$node-set"/>
<xsl:text> Value-of tree:</xsl:text>
<xsl:value-of select="$tree"/>
<xsl:text> Copy-of tree:</xsl:text>
<xsl:copy-of select="$tree"/>
</xsl:template>
</xsl:stylesheet>