Speak.Me Учить иностранные слова

XSL: копирование узлов. Инструкции xsl:copy, xsl:copy-of и xsl:copy-of

XSL позволяет не только создавать новые xml-узлы, но и копировать существующие из исходного дерева в конечное. Для этого используются инструкции xsl:copyxsl:copy-of и xsl:copy-of.

Инструкция xsl:copy

С помощью инструкций xsl можно не только создавать новые узлы в конечном дереве, но и выполнять различные действия с уже имеющимися узлами из исходного дерева. Инструкция xsl:copy позволяет просто скопировать текущий узел из исходного дерева в конечное. При этом копируется только сам узел, точнее его имя (название), но ни атрибуты узла, ни его потомки не копируются.

Синтаксис:

Атрибуты:

  • use-attribute-sets – необязательный атрибут, действует аналогично одноименному атрибуту инструкции xsl:element.

Инструкция xsl:copy может содержать другие инструкции и фиксированные конечные элементы. Все содержимое элемента xsl:copy (т.е. все его потомки) будет являться содержимым (потомками, атрибутами) копируемого им конечного элемента. Свою специфику имеет обработка корневого узла. Если текущий узел является корневым, то xsl:copy не будет копировать (создавать) корневой узел, а будут использованы только инструкции и фиксированные конечные элементы из его содержимого.

Инструкция xsl:value-of

Для копирования текстовых узлов из исходного дерева в конечное используется инструкция xsl:value-of.

Синтаксис:

Атрибуты:

  • select – обязательный атрибут, значением его является выражение XPath (без фигурных скобок). После обработки данного выражения будет получен узел, содержимое которого и будет в виде строки скопировано в конечное дерево. Если данная строка окажется пустой, конечный текстовый узел вообще не создается. Скопированный текстовый узел будет объединен с любыми соседствующими с ним текстовыми узлами.
  • disable-output-escaping – аналогичен одноименному атрибуту инструкции xsl:text, описанному выше.

С помощью данной инструкции можно копировать не только текстовые узлы, но и любые другие. При этом они все равно будут рассматриваться как текст (т.е. будут преобразованы в строку). Однако на конечный результат это, как правило, не влияет. Чтобы скопировать набор узлов в конечное дерево, не преобразуя его в строку, можно использовать инструкцию xsl:copy-of.

Инструкция xsl:copy-of

Чтобы вставить фрагмент исходного дерева в конечное дерево без предварительного преобразования его в строку (как это делает инструкция xsl:value-of) можно использовать инструкцию xsl:copy-of.

Синтаксис:

Атрибуты:

  • select – обязательный атрибут, значением его является выражение XPath. Если результатом обработки этого выражения является фрагмент исходного дерева, то этот фрагмент целиком копируется в конечное дерево. Если же результатом является набор узлов, в конечное дерево копируются все узлы этого набора и в том порядке, как они были в исходном дереве. При копировании элемента, вместе с ним копируются также узлы атрибутов, узлы пространства имен и непосредственные потомки этого элемента. Если результат обработки выражения XPath не является ни набором узлов, ни фрагментом конечного дерева, то он преобразуется в строку, а затем помещается в конечное дерево, как при использовании xsl:value-of.

Свою специфику имеет обработка корневого узла. Если текущий узел является корневым, то xsl:copy-of не будет копировать сам корневой узел, а скопирует только его непосредственных потомков.