2013-04-22 51 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()節點測試沒有不同的行爲,具體取決於它是否在matchselect屬性中。身份模板的擴展版本如下:

<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>