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

xsl:copy

Элемент xsl:copy создает копию текущего узла вне зависимости от его типа.

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

Синтаксис

<xsl:copy
    use-attribute-sets = "наборы атрибутов">
    <!-- Содержимое: шаблон -->
</xsl:copy>

Атрибуты:

use-attribute-sets
необязательный атрибут, задает именованные наборы атрибутов.

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

Пример 1

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

Входящий документ:

<a>
    text
    <b attr="value" />
    <c />
    <d>
        text
        <e />
    </d>
</a>

Шаблон преобразования:

<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>

Пример 2

Если 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>

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

Пример 3

Пример показывает как атрибуты xml:lang могут быть легко скопированы из исходного дерева в конечное. Если в стиле определен следующий именованный шаблон:

<xsl:template name="apply-templates-copy-lang">
    <xsl:for-each select="@xml:lang">
        <xsl:copy />
    </xsl:for-each>
    <xsl:apply-templates />
</xsl:template>

то вместо

<xsl:apply-templates />

можно легко сделать

<xsl:call-template name="apply-templates-copy-lang" />

если необходимо скопировать атрибут xml:lang.

Пример 4

```xml tab="XML"

Gambardella, Matthew XML Developer's Guide Computer 44.95 2000-10-01 An in-depth look at creating applications with XML. Ralls, Kim Midnight Rain Fantasy 5.95 2000-12-16 A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world. Corets, Eva Maeve Ascendant Fantasy 5.95 2000-11-17 After the collapse of a nanotechnology society in England, the young survivors lay the foundation for a new society.

```xslt tab="XSLT"
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >

  <xsl:template match="/ | @* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

```xml tab="Output"

Gambardella, MatthewXML Developer's GuideComputer44.952000 -10-01An in-depth look at creating applications with XML. ... ```

См. также

Ссылки