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>