2017-08-14 101 views
0

我試圖從XPath中的JCR中選擇一個文件夾及其後代。我可以很容易地選擇足夠的文件夾:選擇元素及其後代

//content/documents/folder-name 

我可以選擇它的後代也:

//content/documents/folder-name//* 

但是,我想不出如何讓兩者。我嘗試了幾件事情。這些選擇什麼:

//content/documents/folder-name | //content/documents/folder-name//* 
//content/documents/folder-name(. | *) 
//content/documents/folder-name/(. | *) 
//content/documents/folder-name/descendant-or-self 
//content/documents/folder-name/descendant-or-self::node() 

這些都拋出javax.jcr.query.InvalidQueryException

​​

顯然我在XPath的可怕。請幫忙。

編輯:我使用的是//前綴,因爲我沒有意識到我可以用/jcr:root/content代替。但是,我也遇到了同樣的問題。

回答

0

您可以使用UNION運算符組合兩個XPath:

xpath1 | xpath2 

然而,你的第一個XPath,

//content/documents/folder-name 

並選擇folder-name元素(一個或多個),其中包括該元素的後裔。

如果你想folder-name元素是先在首位,其次是他們的後代,你可以結合如下:

//content/documents/folder-name | //content/documents/folder-name//* 
+0

'/ jcr:root/content/documents/folder-name |/jcr:root/content/documents/folder-name/*'什麼也不選。同樣也適用於'// content/documents/folder-name | //內容/文檔/文件夾名稱// *'。 '// content/documents/folder-name'不包含後代。 –

+1

也許你最好發佈樣本XML和你期待的確切結果,以便我們知道你想要做什麼。您評論中的XPath現在包含名稱空間前綴,這是潛在問題的另一個可能來源,我們無法在沒有看到您的XML的情況下進行診斷。 – kjhughes

+0

我想要,但它是一個巨大的文件與NDA的東西在裏面。當我有幾分鐘的時間時,我會嘗試讓事情更近一些。 –

0

//content/documents/folder-name/descendant-or-self::node()看起來是正確的,我(沒有看到你的XML輸入),雖然//content/documents/folder-name/descendant-or-self::*可能會更好。

當然,如果//content/documents/folder-name選擇了一些東西,那麼`content/documents/folder-name/descendant-or-self :: *`也應該選擇一些東西。

在XPath 2.0中,你可以做//content/documents/folder-name/(.|descendant::*),但雖然它比較短,但對於我來說比使用後代或自我軸還要笨拙。