2010-12-15 65 views
2

我有一個問題過濾在玉蘭jackrabbit jcr的特定節點。過濾「元數據」 - 從xpath查詢在玉蘭jcr

當我提交以下查詢://element(*, standort)//*

我得到:

33 nodes returned in 18ms 
/standort/Standorte/MetaData 
/standort/Standorte/standort-de 
/standort/Standorte/standort-de/MetaData 
/standort/Standorte/standort-de/Teststandort 
/standort/Standorte/standort-de/Teststandort/MetaData 
/standort/Standorte/standort-de/Hauptwerk-Köln 
/standort/Standorte/standort-de/Hauptwerk-Köln/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Berlin 
/standort/Standorte/standort-de/Geschäftsstelle-Berlin/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt 
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg 
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Hannover 
/standort/Standorte/standort-de/Geschäftsstelle-Hannover/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Köln 
/standort/Standorte/standort-de/Geschäftsstelle-Köln/MetaData 
/standort/Standorte/standort-de/Werk-Leipzig 
/standort/Standorte/standort-de/Werk-Leipzig/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-München 
/standort/Standorte/standort-de/Geschäftsstelle-München/MetaData 
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart 
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart/MetaData 
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk) 
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk)/MetaData 
/standort/Standorte/standort-de/Gelsdorf-(Handläufe) 
/standort/Standorte/standort-de/Gelsdorf-(Handläufe)/MetaData 
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH 
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH/MetaData 
/standort/Standorte/standort-en 
/standort/Standorte/standort-en/MetaData 
/standort/Standorte/standort-en/Böttcher-UK-Ltd- 
/standort/Standorte/standort-en/Böttcher-UK-Ltd-/MetaData 

但我想只有節點:

/standort/Standorte/standort-de/Teststandort 
/standort/Standorte/standort-de/Hauptwerk-Köln 
/standort/Standorte/standort-de/Geschäftsstelle-Berlin 
/standort/Standorte/standort-de/Geschäftsstelle-Frankfurt 
/standort/Standorte/standort-de/Geschäftsstelle-Hamburg 
/standort/Standorte/standort-de/Geschäftsstelle-Hannover 
/standort/Standorte/standort-de/Geschäftsstelle-Köln 
/standort/Standorte/standort-de/Werk-Leipzig 
/standort/Standorte/standort-de/Geschäftsstelle-München 
/standort/Standorte/standort-de/Geschäftsstelle-Stuttgart 
/standort/Standorte/standort-de/Gelsdorf-(Mischwerk) 
/standort/Standorte/standort-de/Gelsdorf-(Handläufe) 
/standort/Standorte/standort-de/KB-Roller-Tech-Kopierwalzen-GmbH 
/standort/Standorte/standort-en/Böttcher-UK-Ltd- 

因此沒有元數據節點和父節點。我需要一切在Standorte之下。 Standorte的孩子可以是standort-destandort-en的類型。 我希望我能讓我的問題更清楚。我在我的問題的最後一個版本中縮短了輸出。到目前爲止,我沒有找到任何可以幫助我的xpath表達式。但這是由於我缺乏xpath知識。

在此先感謝!

+0

奇怪的結果!它也應該選擇'/ standort/Standorte'。如果您正在使用PSVI,爲什麼不匹配'Teststandort'類型註釋? – 2010-12-15 13:43:49

+0

@Alejandro:呃,我不知道。也許xpath在選擇長耳兔中的節點時工作不同。 – meltac 2010-12-15 15:05:35

+0

然後'Standorte'元素具有'standort'類型註釋,結果通知所選節點的完整絕對路徑。 – 2010-12-15 15:20:14

回答

2

表達

//element(*, standort)//* 

選擇的任何元素(最終*),其是一個元素的後代(第二//)已被成功驗證針對某個架構定義的類型定義文件(//element())中的任何位置爲standort。 (感謝@Alej幫助正確這一說法,並以下。)

所以基本上你選擇的每一個元素是經過驗證的standort元素的後裔,假設你已經成功連接的模式..

嘗試XPath表達式(更新):

/standort/Standorte/(standort-de | standort-en)/* 
+0

@LarsH:這是XPath 2.0,'element()'節點測試的第二個參數與類型註釋相匹配。 – 2010-12-15 13:38:58

+0

我希望我的修改後的問題更好理解。當然,我不是指'/'節點,而是葉子的父母 – meltac 2010-12-15 15:00:52

+0

@meltac,你是否嘗試過XPath表達式'/ standort/Standorte /(standort-de | standort-en)/ *',結果如何? – LarsH 2010-12-15 15:17:13

2

使用

(//element(*, standort)//*)[not(ancestor-or-self::MetaData)] 
+0

@Dimitre:謝謝,這個查詢聽起來也很自我解釋,但xpath返回以下錯誤:null for語句:for $ v in(// element(*,standort)// *)[不(祖先或自己::元數據)] return $ v:null – meltac 2010-12-15 17:42:32

+0

@meltac:我的答案中沒有'$ v'。我只保證我的答案是正確的 - 超出它的任何東西都可能是正確的,也可能不正確。另外,你的表情似乎有一個錯字 - 一個'*'在多個地方缺失。如果你沒有選擇任何節點,但是你確實得到了你問題中報告的選定節點,那麼你的XPath引擎就會被破壞。我做了兩件事:1.採取你的表情,並用括號包圍它。這應該選擇相同的節點。 2.附加一個謂詞,用於過濾任何「元數據」或具有「元數據」祖先的節點。這*應該*工作。 – 2010-12-15 17:54:49

+0

@Dimitre - 我認爲他評論中缺少的'*'字符被解析爲斜體標記。 – LarsH 2010-12-15 21:02:17