2017-08-14 78 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::*),但虽然它比较短,但对于我来说比使用后代或自我轴还要笨拙。