2012-08-16 46 views
0

考慮下面的XML文件:屬性和XPath表達式計數()

<a m="1"> 
    <b n="1" o="2"> 
     <c p="3">3</c> 
     <d/> 
    </b> 
    <b n="1" o="2"> 
     <c p="3">3</c> 
     <d q="3"> 
      <e r="2">2</e> 
     </d> 
     <f s="1"/> 
    </b> 
</a> 

我怎樣可以找到以下表達式:

1. count(/*/*/*) = 5 
2. count (/*//*) = 6 
3. count (/*/*//@*) = 4 

我跑在Java的XPath表達式的XML文件,但我不明白爲什麼答案是5,6,4。

有人可以解釋我怎樣才能計算上述表達式(不使用java代碼),但通過了解命令的實際概念/*/*/*/*//*/*/*//@*

非常感謝

+1

想必這個練習來* *後XPath的一些教材?你覺得你對教材有所瞭解嗎? – AakashM 2012-08-16 14:39:48

回答

4
/*/*/* 

這將選擇頂級元素的所有「大兒 - 它們是:cdcd

/*//* 

這將選擇頂級元素的所有後代元素:bcd,b,c, d,e,f

/*/*//@* 

這將選擇所有屬性任一頂元素的子元素或他們的後代:nopnopqrs

因此,計數產生必須是,分別爲:

4, 8, 9 

XSLT - 基於驗證

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:value-of select="count(/*/*/*)"/> 
========= 
    <xsl:value-of select="count(/*//*)"/> 
========= 
    <xsl:value-of select="count(/*/*//@*)"/> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔(從未進行這種轉化, 從未曾經呈現過一張圖片!!!):

<a m="1"> 
<b n="1" o="2"> 
    <c p="3">3</c> 
    <d/> 
</b> 
<b n="1" o="2"> 
    <c p="3">3</c> 
    <d q="3"> 
    <e r="2">2</e> 
    </d> 
</b> 
<f s="1"/> 
</a> 

的XPath表達式進行評估,其結果將被複制到輸出

4 
========= 
    8 
========= 
    9 
+0

@DimitreNovatchev如果您要在評論中宣傳您的產品,那麼您必須*披露您與該產品的關係。如果不是,那麼這些評論必須刪除。 – casperOne 2012-08-21 15:44:32

0

再次運行您的java代碼,但沒有計數功能。你會得到一個節點列表(有時是元素和某些時間屬性)。迭代列表並寫出每個節點的名稱。這將幫助您瞭解哪些節點包含在每個計數中。

3

1-查找這是根元素 的直接後裔的直接後裔在這種情況下,元素的嫡系

/a/b[1]/c 
/a/b[1]/d 

/a/b[2]/c 
/a/b[2]/d 
/a/b[2]/f 

是你的答案。

2 - 所有子孫下元素 的第一級(直接或間接)元素在這種情況下

/a/b[1]/c 
/a/b[1]/d 

/a/b[2]/c 
/a/b[2]/d 
/a/b[2]/d/e 
/a/b[2]/f 

是你的答案。

3-找到屬於第一級別的元素 直接後代的後代在這種情況下,所有的屬性

/b[1]/@n 
/b[1]/@o 
/b[1]/c/@p 

/b[2]/@n 
/b[2]/@o 
/b[2]/c/@p 
/b[2]/d/@q 
/b[2]/d/e/@r 
/b[2]/f/@s 

是你的答案。

正如你在這裏看到的,對第三種情況的回答是9,因爲你寫錯了。爲了使它返回你必須改變它作爲count(/*/*/*/@*)

編輯:校正指數由Mimo指出。

+0

您可以嘗試查看http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm中的結果 – edokan 2012-08-16 14:36:27

+2

小小qubble:在XPath中,節點的編號從1開始,而不是從0開始 - 它會更好寫'/ b [1]/@ n','/ b [2]/@ n'等 – MiMo 2012-08-16 14:42:58

+0

你是絕對正確的。我的壞:) – edokan 2012-08-16 14:53:49