Книга: Технология XSLT

Элемент 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>

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

Оглавление книги

Оглавление статьи/книги

Генерация: 0.038. Запросов К БД/Cache: 0 / 3
поделиться
Вверх Вниз