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>