2017-05-04 112 views
-1

是否有可能寫的Xpath exression找到以下節點:的XPath:具有相同名稱的嵌套節點

a/b/c 
a/b/b/c 
a/b/b/b/c 
a/b/b/b/.../b/.../b/c 

但不

a/b/b/e/b/c 

感謝您的任何意見

+1

你是指類似於正則表達式「ab + c」的東西? – ceving

+0

我不認爲你可以單獨使用xpath來實現這一點。您的要求似乎表明最終結果不應包含'e',在這種情況下,您應該使用xslt轉換xml以刪除'e',並且您可以在其上運行xpath。 – SomeDude

+0

@ceving準確 – Denis

回答

1

對於以下輸入:

<root> 
    <a><b><c>1</c></b></a> 
    <a><b><b><c>2</c></b></b></a> 
    <a><b><b><b><c>3</c></b></b></b></a> 
    <a><b><b><e><b><c>4</c></b></e></b></b></a> 
    <a><b><b><e><b><b><c>5</c></b></b></e></b></b></a> 
</root> 

你可以試試下面的表達式:

//a[deep-equal(distinct-values(descendant::*[position()<last()]/name()), ('b'))]//c 

它是如何工作的:

對於任何a除了最後一個後代以外的所有名字都被計算出來,並且檢查該名字的不同列表是否與只包含b的列表匹配。而對於這樣的a後裔c是你想要選擇的。

我用2010版XMLSpy測試了它,它返回了包含1,2和3的c元素。我認爲更現代的工具也可以工作。但你至少需要XPath 2.0。

+0

它的工作原理!謝謝! – Denis

0

問題不完全清楚,但你可以嘗試使用下面的表達式:

//a[.//b and not(.//e)]//c[not(.//*)] 

這應該允許匹配c有沒有自己的孩子,是a後裔,有b後代,但不是e

UPDATE

您可以嘗試

//a[count(.//b)=count(.//*)-count(.//c)]//c[not(.//*)] 

//a[not(.//*[not(self::b)]//c)]//c[not(.//*)] 
+0

我希望只有名稱爲b的標籤位於a和c之間 – Denis

+0

檢查已更新的答案並讓問題仍然存在 – Andersson