2015-08-28 99 views
6

在XPath 1.0中,如何選擇當前(上下文)節點A的所有後代節點C,這些節點不包含在類型B的中間節點中?選擇其他類型元素中未包含的後代元素

例如,查找當前元素中包含的所有<a>鏈接,這些鏈接不在<p>之內。但是如果當前元素本身在<p>之內,那就沒有關係了。

<p>     <—— this is irrelevant, because it's outside the current element 
    ... 
    <div>    <—— current element (context node) 
     ... 
     <a></a>  <—— the xpath should select this node 
     ... 
     <p> 
      ... 
      <a></a> <—— but not this, because it's inside a p, which is inside context 
      ... 
     <p> 
     ... 
    </div> 
    ... 
</p> 

該示例中的...可以是幾個深度的中間節點。

我正在編寫XSLT 1.0,因此可以使用附加功能generate-id()current()等。

+0

類似'/ p/div/a'?這是重複的http://stackoverflow.com/questions/15818191/xpath-select-one-type-of-nodes-only-in-direct-child-nodes – fukanchik

+1

@fukanchik不,我已經在' div'(當前上下文節點),我需要選擇所有不在'p'內的'a',可能有幾個中間節點,例如幾個中間節點。 – Tobia

回答

5

這是一個可能的XPath:

.//a[not(ancestor::p/ancestor::* = current())] 

此XPath檢查是否當前後代a元件不具有祖先p其祖先是當前上下文節點。換句話說,它檢查a元素是否具有介於a和當前上下文節點之間的祖先p

+1

這很有道理,但'='在那裏做正確的事情?我不需要''。a [not(ancestor :: p/ancestor :: * [generate-id(。)= generate-id(current())])]'? – Tobia

+0

@Tobia對不起,我不確定我的自我,如果表達式將比較元素的值或通過引用比較元素(我希望它做) – har07

+2

我不認爲它是正確的,因爲「如果兩個對象都是比較是節點集,則當且僅當第一節點集中存在節點並且第二節點集中存在節點時比較才爲真,以便對**字符串值執行比較的結果**這兩個節點是真的。「 [source](http://www.w3.org/TR/xpath/#booleans) – Tobia

相關問題