2011-03-22 39 views
3

我有下面的XML:XSL使用節點的索引在任何級別

<content> 
<p>para 1<an>test 1</an></p> 
<p>para 2<an>test 2</an></p> 
<p>para 3<an>test 3</an></p> 
</content> 

和我在XSL以下表達式:

<xsl:template match="/"> 
<xsl:text>Count: </xsl:text> 
<xsl:value-of select="count(/content//an)" /> 
<xsl:text> Content: </xsl:text> 
<xsl:value-of select="/content//an[2]" /> 
</xsl:template> 

爲什麼/內容//一個[1]返回「test 1」和/ content // an [2]返回「」?伯爵說有3個。我正在使用libxslt。

謝謝!

+0

好問題,+1。查看我的答案以獲得解釋和完整且簡單的解決方案。 – 2011-03-22 13:33:49

+0

可能重複的[爲什麼// span \ [2 \]不選擇文檔中的第二個跨度?](http://stackoverflow.com/questions/4780559/why-does-span2-not-select-the-第二跨度在文件) – 2011-03-22 22:57:33

回答

6

這是一個常問問題

使用//縮寫時,一定要小心。

//SomeName[1] 

意味着:選擇文檔中的所有元素SomeName是他們的父母的第一個孩子SomeName。通常所選節點不止一個(或甚至是所有節點)。

正確的做法應該只選擇文檔中的$ k個SomeName元素

(//SomeName)[$k] 

在你的情況下,使用

(/內容//一) [2]

還記得[]運算符具有更高的優先級(綁定更強)比//的縮寫。

+0

+1。我敢打賭,你有這個答案的熱鍵。 – Flack 2011-03-23 10:28:59

+0

@Flack:我希望這是可能的:) – 2011-03-23 12:30:56