2013-08-16 19 views
0

關於我的questionXSLT現在的位置()值相應於過濾節點

position()函數返回整個文檔中實際節點,如何得到位置 相對於選擇的節點的位置。比方說,我有100個城市的名單,我根據給定的過濾器列表(請參見問題)排除10,現在我希望根據選定的節點進行計數,而不是原始文檔位置。

簡而言之,這是一個計數器/增量問題,因爲我看到計數器是不可能的。我們如何創建或使用現有的函數來像position()那樣獲取選定節點中節點的位置。

我希望我的問題很清楚。

編輯示例場景

<xsl:template match="/"> 
    <xsl:apply-templates select="db:databaseChangeLog/db:changeSet[*[1][($excludes eq '' or not(@tableName = tokenize($excludes, ',')))]]"/> 
    </xsl:template> 

    <xsl:template match="db:changeSet"> 
     ... 
    </xsl:template> 

我在哪裏基於子節點上選擇父節點屬性名稱。

+1

也許[這個答案](http://stackoverflow.com/questions/226405/find-position-of-a-node-using-xpath)會幫助你嗎? –

回答

1

我認爲使用xsl:number會更好。使用xsl:number,您應該可以更輕鬆地排除元素。

下面是一個小例子,顯示了position()xsl:number的結果作爲比較。

XML輸入

<cities> 
    <city>City One</city> 
    <city>City Two</city> 
    <city>City Three</city> 
    <city>City Four</city> 
    <city>City Five</city> 
    <city>City Six</city> 
    <city>City Seven</city> 
    <city>City Eight</city> 
    <city>City Nine</city> 
    <city>City Ten</city> 
</cities> 

XSLT 2.0(我認爲2.0是安全的假設,因爲這個問題被標記撒克遜和你在註釋中使用的記號化。)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:variable name="exclude" select="('City Three','City Six','City Nine')"/> 

    <xsl:template match="city[not(.=$exclude)]"> 
     <city position="{position()}"> 
      <xsl:attribute name="number"> 
       <xsl:number count="city[not(.=$exclude)]"/> 
      </xsl:attribute> 
      <xsl:value-of select="."/> 
     </city> 
    </xsl:template> 

    <xsl:template match="city"/> 

</xsl:stylesheet> 

輸出

<cities> 
    <city position="1" number="1">City One</city> 
    <city position="2" number="2">City Two</city> 
    <city position="4" number="3">City Four</city> 
    <city position="5" number="4">City Five</city> 
    <city position="7" number="5">City Seven</city> 
    <city position="8" number="6">City Eight</city> 
    <city position="10" number="7">City Ten</city> 
</cities> 
+0

謝謝我有類似的問題 – sakhunzai

1

您對position功能的描述是錯誤的。請參見http://www.w3.org/TR/xslt20/#focus,特別是「上下文位置是當前正在處理的項目序列中的上下文項目的位置。每當上下文項目發生更改時它都會更改。當xsl:apply-templates或xsl:for-each之類的指令是用於處理一系列項目,序列中的第一個項目的上下文位置爲1,第二個項目的上下文位置爲2,依此類推。]上下文位置由XPath表達式position()返回, 」。

例如,如果我們有<xsl:apply-templates select="cities/city[not(@abbr = $skip/abbr)]"/>,並且我們在模板匹配city元素中使用position函數,

<xsl:template match="city"> 
    <xsl:copy> 
    <xsl:value-of select="position()"/> 
    </xsl:copy> 
</xsl:template> 

我們會得到<city>1</city><city>2</city>等等。

+0

我有......計算例如'> ' – sakhunzai

+0

感謝您澄清,我如何在apply-templates – sakhunzai