Элемент xsl:copy

Элемент xsl:copy

Ниже представлена синтаксическая конструкция этого элемента:

<xsl:copy

 use-attribute-sets = "наборы атрибутов">

 <!-- Содержимое: шаблон -->

</xsl:copy>

Элемент xsl:copy создает копию текущего узла вне зависимости от его типа. Вместе с текущим узлом в выходящее дерево копируются только узлы пространств имен, ассоциированные с ним. Дочерние узлы и узлы атрибутов в выходящий документ не копируются.

Если xsl:copy используется для копирования корневого узла или узда элемента, в выходящем документе процессор создает дочерний фрагмент дерева, являющийся результатом выполнения шаблона, содержащегося в xsl:copy.

Пример

Предположим, что в каждый элемент преобразовываемого документа нам нужно добавить атрибут element-count со значением, равным количеству его дочерних элементов, а все остальные узлы оставить, как есть.

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

<а> text

 <b attr="value"/>

 <c/>

 <d>

  text

  <e/>

 </d>

</a>

Листинг 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>

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