2013-07-09 68 views
1

我使用下面的查詢:使用XPath選擇第n個元素是返回更多結果則預計

//*[contains(concat(" ", normalize-space(@class), " "), " sub-category-wrap ")][1]/dl/dt

這應該選擇第一個.sub-category-wrap並返回它的/dl/dt內容。理想情況下,這將是:

  • Yarn
  • Mice

出於某種原因,它返回:

  • Yarn
  • Mice
  • Fast Tires
  • Fancy Paint

所以,出於某種原因,它抓住從dt的兩個.clear-wrap元素的內容。我似乎無法得到它從第n .sub-category-wrap選擇dt的。

注意: xpath查詢中的[1]選擇器實際上是我的代碼中的一個變量,因此請記住您提供的解決方案。

<div class="clear-wrap"> 
     <div class="sub-category-wrap"> 
     <h3>Cats</h3> 
     <dl>  
      <dt>Yarn</dt> 
      <dd><!-- Content --> </dd> 
      <dt>Mice</dt> 
      <dd><!-- Content --></dd> 
     </dl> 
     </div> 
    <div class="sub-category-wrap"> 
     <h3>Dogs</h3> 
     <dl>  
      <dt>Kibbles</dt> 
      <dd><!-- Content --> </dd> 
      <dt>Drool</dt> 
      <dd><!-- Content --></dd> 
     </dl> 
     </div> 
</div> 
<div class="clear-wrap"> 
     <div class="sub-category-wrap"> 
     <h3>Cars</h3> 
     <dl>  
      <dt>Fast Tires</dt> 
      <dd><!-- Content --> </dd> 
      <dt>Fancy Paint</dt> 
      <dd><!-- Content --></dd> 
     </dl> 
     </div> 
    <div class="sub-category-wrap"> 
     <h3>Trucks</h3> 
     <dl>  
      <dt>Mud Tires</dt> 
      <dd><!-- Content --> </dd> 
      <dt>Loud Pipes</dt> 
      <dd><!-- Content --></dd> 
     </dl> 
     </div> 
</div> 
+0

就像澄清一樣,'// * [contains(..)] [2]'和'// * [contains(..)] [3]'的結果應該是什麼? – 2013-07-09 01:48:40

回答

2

您的查詢所做的是檢查元素是第一個子元素,而不是它是第一個結果節點集。這應該工作打算:

(//div[contains(concat(" ", normalize-space(@class), " "), " sub-category-wrap ")])[1]/dl/dt 
2

查詢//x[1]意味着/descendant-or-self::node()/child::x[1],其中選擇文檔中的每個元素的第一個X孩子。你想要的是(//x)[1]它選擇由//x選擇的序列中的第一個節點。

+0

雖然目前接受的答案解決了OP所具有的特定問題。這個答案更清楚地解釋了一般意義上的潛在混淆和適當的解決方案。 – Tim

相關問題