Перейти к содержанию

xsl:copy-of

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

Синтаксис

<xsl:copy-of select="выражение" />

Атрибуты:

select
обязательный атрибут, выражение вычисляет набор копируемых узлов.

Описание и примеры

Поведение 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>

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

Value-of boolean:false
Copy-of boolean:false
Value-of string:text
Copy-of string:text
Value-of number:3.14
Copy-of number:3.14
Value-of node-set:10
Copy-of node-set:<item>10</item><item>20</item><item>30</item>
Value-of tree:
    text
        text
Copy-of tree:<root>
    text
    <branch>
        text
        <leaf/>
        <leaf/>
    </branch>
    <leaf/>
</root>

Учтите, что в XSLT 1.0 и 2.0 поведение этого элемента различно:

Для XSLT 1.0:

  • Если атрибут select определяет фрагмент дерева результата, то весь фрагмент копируется в дерево результата.
  • Если атрибут select определяет набор узлов, то все узлы набора копируются в дерево результата в порядке документа. В отличие от <xsl:copy>, узел копируется полностью – со всеми узлами пространств имен, атрибутов и дочерними узлами.
  • Если атрибут select определяет нечто отличное от фрагмента дерева результата или набора узлов, это «нечто» преобразуется в строку и вставляется в дерево результата.

Для XSLT 2.0:

  • Если атрибут select определяет элемент, то этот элемент со всеми потомками и атрибутами копируется в выходной документ. По умолчанию узлы пространства имен элемента тоже копируются, хотя это поведение можно изменить при помощи атрибута copy-namespaces.
  • Если атрибут select указывает на узел документа, этот узел документа со всеми потомками копируется в выходной документ.
  • Все остальные типы узлов (узлы атрибутов, пространств имен, текста, комментариев и инструкций по обработке) копируются в выходной документ.
  • Атомарные значения присоединяются к итоговой последовательности.

См. также

Ссылки