2013-01-02 65 views
6

是否可以檢查與同一模板中的模板匹配的節點的類型?如果是這樣,我該怎麼做?例如,我願做這樣的事情:檢查XSL模板中節點的類型

<xsl:template match="@*|node()"> 
    <xsl:choose> 
     <xsl:when test="current() is an attribute"> 
     <!-- ... --> 
     </xsl:when> 
     <xsl:when test="current() is an element"> 
     <!-- ... --> 
     </xsl:when> 
     <xsl:otherwise> 
     <!-- ... --> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+1

蒂姆給了一個很好的答案,但我不知道爲什麼你需要做的這個模板內,你爲什麼不只是寫更具體的匹配模式與不同的節點類型不同的模板。 –

+0

我對這是教育目的感興趣。我正在構建XSL轉換以突出顯示XML文檔中的XPath表達式所匹配的節點。在實際應用中,我不會這樣做。 – hielsnoppe

回答

17

看看這個答案在這裏,因爲這應該給你的信息,你需要:

Difference between: child::node() and child::*

這給出了以下xsl:選擇來測試所有節點,包括文檔節點。

<xsl:choose> 
    <xsl:when test="count(.|/)=1"> 
    <xsl:text>Root</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::*"> 
    <xsl:text>Element </xsl:text> 
    <xsl:value-of select="name()"/> 
    </xsl:when> 
    <xsl:when test="self::text()"> 
    <xsl:text>Text</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::comment()"> 
    <xsl:text>Comment</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::processing-instruction()"> 
    <xsl:text>PI</xsl:text> 
    </xsl:when> 
    <xsl:when test="count(.|../@*)=count(../@*)"> 
    <xsl:text>Attribute</xsl:text> 
    </xsl:when> 
</xsl:choose> 
+1

很好,但你錯過了命名空間節點。 –

6

更精確的方法來確定是否所述節點$node一個根節點

not(count($node/ancestor::node())) 

在TimC的回答中的表達測試當前節點的類型:

count(.|/)=1 

但不適用於我們想要確定變量中節點類型的情況 - 可能屬於另一個文件 - 而不是當前文件。

此外,爲命名空間節點測試:

count($node | $node/../namespace::*) = count($node/../namespace::*)