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()"
與文檔根或屬性不匹配,因爲它們不在任何節點的子軸上。
你可以觀察到,身份模板不根節點匹配,因爲這沒有任何輸出:「根匹配」
<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()
測試適用於根節點和屬性,方法是在任何具有屬性的文檔上運行此項:
<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:apply-templates select="@* | node()" />
</xsl:template>
<xsl:template match="/">
<xsl:if test="self::node()">
node() matches the root!
</xsl:if>
<xsl:apply-templates select="@* | node()" />
</xsl:template>
<xsl:template match="@*">
<xsl:if test="self::node()">
node() matches an attribute!
</xsl:if>
</xsl:template>
</xsl:stylesheet>
這裏是另一種觀察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>