Эта таблица стилей также будет работать:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<!--Identity template to copy content forward-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<!--specialized template for elements with an "n" attribute-->
<xsl:template match="*[@n]">
<xsl:element name="{@n}">
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Первый шаблон в шаблоне идентификации , который соответствует @*
(что означает любой атрибут) и node()
(что означает любой элемент, текстовый узел, инструкцию обработки или комментарий).Поведение по умолчанию - копировать соответствующий элемент, а затем apply-templates
в любой из его атрибутов или дочерних узлов.
Если никакие другие шаблоны не были объявлены в таблице стилей, тогда этот шаблон идентификации будет совпадать для всех, и XSLT просто сделает копию документа XML.
Второй шаблон соответствует на *[@n]
, который является любым элементом, который имеет атрибут "n".*
- подстановочный знак для любого элемента.Квадратные скобки представляют собой фильтр предикатов, который действует подобно предложению SQL WHERE.Любые условия, указанные в предикате, должны быть истинными, чтобы шаблон соответствовал выбранным параметрам.Фильтр предикатов оценивает из контекста сопоставленного элемента, поэтому, если вы «стоите» на элементе, имеет ли он @n
?Если это так, то этот шаблон соответствует.
Второй шаблон имеет более конкретные критерии соответствия, чем первый шаблон «идентичности», поэтому он «выигрывает» и будет соответствовать элементам, которые имеют @n
. * 1020.*
Логика для второго шаблона заключается в создании элемента с именем значения @n
и затем apply-templates
для любого дочернего элемента node()
(который включает в себя как text()
, так и элементы, ноне включает атрибуты).