2013-04-22 3 views
1

ли известный XSLT шаблон 1,0 идентичностичто явный вариант узла()

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

синоним

<xsl:template match="/|@*|*|processing-instruction()|comment()|text()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|*|processing-instruction()|comment()|text()"/> 
    </xsl:copy> 
</xsl:template> 

т.е. это исправить этот узел() включает/в матче и не включает/в инструкцию select?

ответ

3

Узел-тест 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>