2017-01-05 54 views
1

我正在嘗試使用XPath生成包含分頁的表格。從基於位置的列表返回頂級元素

這裏的兩個項目爲例:

<?xml version="1.0" encoding="utf-8"?> 
<d:data xmlns:d="defiant-namespace" d:constr="Array" d:mi="114"> 
    <d:item d:mi="24"> 
     <name d:constr="String" d:mi="13">/Partition/MYLB1</name> 
     <ip d:constr="String" d:mi="14">1.1.1.1</ip> 
     <port d:constr="String" d:mi="15">80</port> 
     <pools d:constr="null"/> 
     <loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer> 
    </d:item> 
    <d:item d:mi="51"> 
     <name d:constr="String" d:mi="25">/Partition/MYLB2</name> 
     <ip d:constr="String" d:mi="26">2.2.2.2</ip> 
     <port d:constr="String" d:mi="27">443</port> 
     <pools d:mi="47" d:type="ArrayItem"> 
      <name d:constr="String" d:mi="46">myPool</name> 
     </pools> 
     <loadbalancer d:constr="String" d:mi="50">LB2</loadbalancer> 
    </d:item> 
    <d:item d:mi="24"> 
     <name d:constr="String" d:mi="13">/Partition/MYLB1</name> 
     <ip d:constr="String" d:mi="14">1.1.1.1</ip> 
     <port d:constr="String" d:mi="15">80</port> 
     <pools d:constr="null"/> 
     <loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer> 
    </d:item>  
</d:data> 

比方說,我只是想在這個列表中的前兩個項目,我該如何實現這一目標?

託管與此查詢做到這一點:

//*[name][position() <= 1] 

不過,我懷疑,如果我以後再添加更多的孩子和他們中的一個具有屬性「名」,它也會受到影響。

這是我想通會的工作,但它返回一個項目很多,我只想到一個:我搜索了

//*[position() <= 1] 

如何搭配獨生子女的第一級,如何獲取數組的位置。但是,在每個出現的線程中,他們知道他們搜索的是哪個值,而我只是想返回與它們的內容或祖先數量無關的元素。

對我如何思考錯誤以及如何正確對待的解釋將非常感謝!


2016年1月5日 - 編輯:修訂在它具有「名稱」較低級的例子。

還增加了一個例子:

我需要的XPath來只返回頂層項目:

即:

<d:item d:mi="24"> 
    <name d:constr="String" d:mi="13">/Partition/MYLB1</name> 
    <ip d:constr="String" d:mi="14">1.1.1.1</ip> 
    <port d:constr="String" d:mi="15">80</port> 
    <pools d:constr="null"/> 
    <loadbalancer d:constr="String" d:mi="23">LB1</loadbalancer> 
</d:item> 

但不是:

<name d:constr="String" d:mi="46">myPool</name> 

/帕特里克

+1

你能請顯示想要的結果? –

+0

已添加示例。 – PatrikJ

回答

0

//*[position() <= 1]將匹配任何父元素的每個第一個孩子。如果你想只匹配<d:item d:mi="12"><d:item d:mi="24">,不管你多少元素添加到父元素在未來,你應該使用

//*[name][position() <= 2] 

這些XPath應該更適合:

//*[name()="d:data"]/*[name][position() <= 2] 

//*[name()="d:data"]/*[name()="d:item"][position() <= 2] 
+0

謝謝您的建議,但是,這也會返回帶有「名稱」的情人級別項目。我已經更新了示例以顯示我的意思。 – PatrikJ

+1

明白了你的觀點。你需要這個''// * [name()=「d:data」]/* [name] [position()<= 2]'。這將只匹配''的直接子女。並且這個''* * [name()=「d:data」]/* [name()=「d:item」] [position()<= 2]'確切的孩子('') – Andersson

+0

非常棒,工作!請更新您的答案,並將其標記爲正確的答案。希望如果有一天幫助別人?我仍然不明白爲什麼'//* * [name] [position()<= 2]'與xml更深的匹配,而'// [name()=「d:data」]/* [name] [ position()<= 2]'不會通過嗎? – PatrikJ

相關問題