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

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 version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="identityxfm.xsl"?>
<catalog>
  <book id="bk101">
    <author>Gambardella, Matthew</author>
    <title>XML Developer's Guide</title>
    <genre>Computer</genre>
    <price>44.95</price>
    <publish_date>2000-10-01</publish_date>
    <description>
      An in-depth look at creating applications with
 XML.
    </description>
  </book>
  <book id="bk102">
    <author>Ralls, Kim</author>
    <title>Midnight Rain</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-12-16</publish_date>
    <description>
      A former architect battles corporate zombies,
 an evil sorceress, and her own childhood to become queen of
      the
 world.
    </description>
  </book>
  <book id="bk103">
    <author>Corets, Eva</author>
    <title>Maeve Ascendant</title>
    <genre>Fantasy</genre>
    <price>5.95</price>
    <publish_date>2000-11-17</publish_date>
    <description>
      After the collapse of a nanotechnology society
 in England, the young survivors lay the foundation for a new
society.
    </description>
  </book>
</catalog>
<?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 version="1.0"?><?xml-stylesheet type="text/xsl"
href="identityxfm.xsl"?><catalog><book id="bk101"><author>Gambardella,
Matthew</author><title>XML Developer's
Guide</title><genre>Computer</genre><price>44.95</price><publish_date>2000
-10-01</publish_date><description>An in-depth look at creating
applications with
XML.</description></book><book id="bk102">
...
</book></catalog>

См. также

Ссылки