2013-06-03 34 views
1

這裏是我的XML:XPath表達式來獲取所有前面的兄弟姐妹UNTIL條件滿足

... 
<table></table> 
<p class="source"></p> 
<p class="notes"></p> 
<p class="notes"></p> 
<p class="notes"></p> 
<p /> 
<p /> 
... 
<table></table> 
<p class="notes"></p> 
<p class="notes"></p> 
<p /> 
... 

我想寫一個被稱爲每個"<p>"標籤模板。該模板將返回該標籤所在的位置相對於其前面的第一個"<table>"標籤的索引。它只應計數"<p>"具有屬性「class」等於「notes」的標籤。

因此,對於上面的例子中,我會希望在下面的評論中所指出的指標:

... 
<table></table> 
<p class="source"></p> 
// should return 0 <p class="notes"></p> 
// should return 1 <p class="notes"></p> 
// should return 2 <p class="notes"></p> 
<p /> 
<p /> 
... 
<table></table> 
// should return 0 <p class="notes"></p> 
// should return 1 <p class="notes"></p> 
<p /> 
... 

這裏是我想出迄今:

<xsl:template name="PrintTableNumberedNote"> 
<xsl:variable name="currentPosition" select="count(preceding-sibling::p[(@class='notes')])"/> 
<xsl:value-of select="$currentPosition"/>.  
</xsl:template> 

我需要添加邏輯,使計數停止在第一次出現的上表,因爲這是如何結果不正確地看這個模板:

... 
<table></table> 
<p class="source"></p> 
// returns 0 <p class="notes"></p> 
// returns 1 <p class="notes"></p> 
// returns 2 <p class="notes"></p> 
<p /> 
<p /> 
... 
<table></table> 
// returns 3 <p class="notes"></p> 
// returns 4 <p class="notes"></p> 
<p /> 
... 

如何將此其他條件與我的XPath語句結合使用?

謝謝

回答

2

一個簡單的方案是前述table之前減去p元素:

<xsl:variable name="currentPosition" select=" 
    count(preceding-sibling::p[@class='notes']) - 
    count(preceding-sibling::table/preceding-sibling::p[@class='notes']"/> 

如果要含有前述table和當前節點之間的所有p元素節點集,您可以嘗試:

<xsl:variable name="numTables" select="count(preceding-sibling::table)"/> 
<xsl:variable name="paragraphs" select=" 
    preceding-sibling::p[ 
     @class='notes' and 
     count(preceding-sibling::table) = $numTables]"/> 

或者,使用

<xsl:variable name="paragraphs" select="preceding-sibling::p 
    [@class='notes'] 
    [position() &lt;= $currentPosition]"/> 

另請參閱this similar question

+0

謝謝!這工作就像一個魅力!我需要找到一個好的路徑XSLT書 - 你有什麼建議嗎? – technopia