2011-12-22 115 views
2

我有下面的XML:如何檢查是否祖先是在他的祖先類型的最後一個元素

<TABLE> 
    <ROW> 
    <ENTRY/> 
    <ENTRY/> 
    </ROW> 
    <ROW> 
    <ENTRY>xxx</ENTRY> 
    <ENTRY>yyy</ENTRY> 
    </ROW> 
    <Z> 
    <ROW> 
     <ENTRY/> 
     <ENTRY/> 
    </ROW> 
    </Z> 
    <ROW> 
    <ENTRY/> 
    <ENTRY/> 
    </ROW> 
</TABLE> 

表結構可以改變,所以我可以有最後一排包沿Z元素,或有可能根本沒有Z元素。

我的目標是刪除表中最後一行條目的底部邊框。 (表映射到HTML表,行到HTML TR,進入HTML TD)

,所以我嘗試使用XSLT模板:

<xsl:template match="ENTRY"> 
    <td> 
    <xsl:if test="(ancestor::ROW[1] = ancestor::TABLE[1]/descendant::ROW[last()])"> 
     <!-- remove the bottom border of td --> 
    </xsl:if> 
    </td> 
</xsl:template> 

但它幾乎所有的細胞去除邊框表(該邊框不會從具有文本內容的單元格中移除)。所以我猜測機制會檢查節點是否具有相同的值(名稱,文本內容,子元素等) - 不是引用。 我試圖在java中使用一些外部函數,但我總是得到一個新的節點引用(即使對於相同的節點),所以我無法比較它。

所以我的問題是 - 如何比較節點的參考... 或以任何其他方式做這項工作。

在此先感謝:)。

回答

4

我的目標是刪除 表中最後一行的條目的底部邊框。 (表映射到HTML表,行到HTML TR,進入HTML TD)

它似乎想要

<xsl:if test= 
    "generate-id(ancestor::ROW[1]) 
    = 
    generate-id(ancestor::TABLE[1]/descendant::ROW[last()])"> 

    <!-- Processing here --> 
</xsl:if> 

我建議你添加一個新的模板和使用模式匹配(而不是明確的條件)捕捉​​到了這個情況:

<xsl:template match= 
"ENTRY[generate-id(ancestor::ROW[1]) 
     = 
     generate-id(ancestor::TABLE[1]/descendant::ROW[last()]) 
     ]"> 

     <!-- Processing here --> 
</xsl:template> 

你更普遍的問題:

所以我的問題是 - 如何節點

的引用比較在XPath 2.0(XSLT 2.0)使用is操作

$n1 is $n2 

測試兩個節點$n1$n2用於節點標識(不是值相等)。

在XPath 1.0(XSLT 1.0):

count($n1|$n2) = 1 

在XSLT 1.0另一種方法是使用標準的XSLT 1.0(在XPath中1不可用。0)函數generate-id(),如在上述溶液中進行:

generate-id($n1) = generate-id($n2) 
0

您的測試(ancestor::ROW[1] = ancestor::TABELA[1]/descendant::ROW[last()])比賽前兩個和你的樣品中的最後兩個ENTRY元素。大概是因爲當呈現爲字符串時,第一個ROW匹配最後的ROW。見http://www.w3.org/TR/xpath/#booleans

我能夠使用選擇最後兩個條目:

//ENTRY[count(ancestor::ROW[1]/preceding::ROW) = count(ancestor::TABLE[1]/descendant::ROW) - 1] 

所以我想,下面將作爲您的測試:

(count(ancestor::ROW[1]/preceding::ROW) = count(ancestor::TABLE[1]/descendant::ROW) - 1) 

更新致謝Dimitre Novatchev和jasso的反饋

這種解決方案並不理想,因爲:

  1. 這些計數是低效的,比需要計算更多的事情。
  2. preceding::軸可能會匹配不止TABLE元素的後代當部分較大的文檔。
+1

MattH:這樣的count()操作通常不是有效的,如果可能的話應該避免。 – 2011-12-22 13:39:10

+0

@DimitreNovatchev:感謝您的反饋。我將留下這個效率低下的解決方案作比較。 – MattH 2011-12-22 14:28:00

+0

關於使用「之前」或「跟隨」軸的一般注意事項:它們的問題在於,如果文檔中存在重複的類似結構,它們會超出預期範圍,從而導致失敗。在這種情況下,如果真實用例比給定示例代碼更復雜,並且存在多個包含''的'

',那麼XPath會失敗。用一個'
'這個也可以。 – jasso2011-12-22 18:09:57