XSL позволяет не только создавать новые xml-узлы, но и копировать существующие из исходного дерева в конечное. Для этого используются инструкции xsl:copy
, xsl:copy-of
и xsl:copy-of
.
Инструкция xsl:copy
С помощью инструкций xsl можно не только создавать новые узлы в конечном дереве, но и выполнять различные действия с уже имеющимися узлами из исходного дерева. Инструкция xsl:copy
позволяет просто скопировать текущий узел из исходного дерева в конечное. При этом копируется только сам узел, точнее его имя (название), но ни атрибуты узла, ни его потомки не копируются.
Синтаксис:
1 2 3 4 | <xsl:copy use-attribute-sets="строка"> Инструкции или фиксированные конечные элементы </xsl:copy> |
Атрибуты:
use-attribute-sets
– необязательный атрибут, действует аналогично одноименному атрибуту инструкцииxsl:element
.
Инструкция xsl:copy
может содержать другие инструкции и фиксированные конечные элементы. Все содержимое элемента xsl:copy
(т.е. все его потомки) будет являться содержимым (потомками, атрибутами) копируемого им конечного элемента. Свою специфику имеет обработка корневого узла. Если текущий узел является корневым, то xsl:copy
не будет копировать (создавать) корневой узел, а будут использованы только инструкции и фиксированные конечные элементы из его содержимого.
Инструкция xsl:value-of
Для копирования текстовых узлов из исходного дерева в конечное используется инструкция xsl:value-of
.
Синтаксис:
1 2 3 | <xsl:value-of select = "XPath" disable-output-escaping = "yes|no" /> |
Атрибуты:
select
– обязательный атрибут, значением его является выражение XPath (без фигурных скобок). После обработки данного выражения будет получен узел, содержимое которого и будет в виде строки скопировано в конечное дерево. Если данная строка окажется пустой, конечный текстовый узел вообще не создается. Скопированный текстовый узел будет объединен с любыми соседствующими с ним текстовыми узлами.disable-output-escaping
– аналогичен одноименному атрибуту инструкцииxsl:text
, описанному выше.
С помощью данной инструкции можно копировать не только текстовые узлы, но и любые другие. При этом они все равно будут рассматриваться как текст (т.е. будут преобразованы в строку). Однако на конечный результат это, как правило, не влияет. Чтобы скопировать набор узлов в конечное дерево, не преобразуя его в строку, можно использовать инструкцию xsl:copy-of
.
Инструкция xsl:copy-of
Чтобы вставить фрагмент исходного дерева в конечное дерево без предварительного преобразования его в строку (как это делает инструкция xsl:value-of) можно использовать инструкцию xsl:copy-of
.
Синтаксис:
1 2 | <xsl:copy-of select = "XPath" /> |
Атрибуты:
select
– обязательный атрибут, значением его является выражение XPath. Если результатом обработки этого выражения является фрагмент исходного дерева, то этот фрагмент целиком копируется в конечное дерево. Если же результатом является набор узлов, в конечное дерево копируются все узлы этого набора и в том порядке, как они были в исходном дереве. При копировании элемента, вместе с ним копируются также узлы атрибутов, узлы пространства имен и непосредственные потомки этого элемента. Если результат обработки выражения XPath не является ни набором узлов, ни фрагментом конечного дерева, то он преобразуется в строку, а затем помещается в конечное дерево, как при использованииxsl:value-of
.
Свою специфику имеет обработка корневого узла. Если текущий узел является корневым, то xsl:copy-of
не будет копировать сам корневой узел, а скопирует только его непосредственных потомков.