Узел-тест node()
не имеет другого поведения в зависимости от того, находится ли он в match
или в атрибуте select
. Расширенная версия шаблона идентичности заключается в следующем:
<xsl:template match="@*|*|processing-instruction()|comment()|text()">
<xsl:copy>
<xsl:apply-templates select="@*|*|processing-instruction()|comment()|text()"/>
</xsl:copy>
</xsl:template>
Узел-тест node()
соответствует любой узел, но если не дано явное оси, то на child::
оси по умолчанию. Таким образом, шаблон match="node()"
не соответствует корню или атрибутам документа, поскольку они не находятся на дочерней оси любого узла.
Вы можете заметить, что шаблон идентичность не совпадает с корневого узла, потому что это не имеет никакого вывода: «Root Сопрягано»
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:if test="count(. | /) = 1">
<xsl:text>Root Matched!</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
и это выходы:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="@* | node() | /">
<xsl:if test="count(. | /) = 1">
<xsl:text>Root Matched!</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Вы можете проверить что тест node()
применяется к корневому узлу и атрибутам, запустив его на любом документе, который имеет атрибуты:
А вот еще один способ, чтобы наблюдать, что тест node()
относится к корневому узлу:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/*">
<xsl:value-of select="concat('The root element has ', count(ancestor::node()),
' ancestor node, which is the root node.')"/>
</xsl:template>
</xsl:stylesheet>