LINUX.ORG.RU

xslt copy


0

1

никак не пойму, что делает этот кусок

<xsl:template match=«node() | @*»>
   <xsl:copy>
      <xsl:apply-templates select=«node() | @*»/>
   </xsl:copy>
</xsl:template>
и сам принцип работы copy


node() соответствует любому дочернему узлу, независимо от его типа.
@* - соответствует любому дочернему атрибуту.
Итого, node()|@* соответствует любому дочернему элементу, который только может встретиться в xml-документе.

xsl:copy копирует узел дерева как он есть, но без потомков и атрибутов.

<xsl:apply-templates select=«node() | @*»/> - вызывает обработку всех дочерних узлов и атрибутов. Если для узла не найдено правило преобразования, то будет вызвана обработка по-умолчанию, но в данном случае такого никогда не случится, ибо рассматриваемый шаблон соответствует любому узлу.

В итоге, данный шаблон рекурсивно копирует все узлы, за исключением тех, которые соответствуют какому-либо шаблону из объявленных выше (в XSL-файле) и может рассматриваться как копирование в глубь по-умолчанию, обеспечивающее рекурсивную обработку документа.

archimag ★★★
()
Ответ на: комментарий от archimag

Скорее «зачем такие извращения»? Любители просто выбрасывать дерево в вывод таким образом вместо copy-of, вероятно, наложили свой отпечаток.

Deleted
()
Ответ на: комментарий от Deleted

> вместо copy-of

Между copy-of и данным кодом есть принципиальная разница. Если задача решается с помощью copy-of, то, конечно, никто так делать не будет.

archimag ★★★
()
Ответ на: комментарий от archimag

Я в курсе.

Если задача решается с помощью copy-of, то, конечно, никто так делать не будет.


Если бы…

Deleted
()
Ответ на: комментарий от Deleted

> Если бы…

Да ладно. Человек, который понимает данный код, уж конечно знает про copy-of. Ну а если использует не понимания, то просто надо сажать читать спецификацию, а пока не разберётся к XSLT не подпускать.

archimag ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.