选择元素及其后代
问题描述:
我试图从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
代替。但是,我也遇到了同样的问题。
答
您可以使用UNION运算符组合两个XPath:
xpath1 | xpath2
然而,你的第一个XPath,
//content/documents/folder-name
并选择folder-name
元素(一个或多个),其中包括该元素的后裔。
如果你想folder-name
元素是先在首位,其次是他们的后代,你可以结合如下:
//content/documents/folder-name | //content/documents/folder-name//*
答
//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::*)
,但虽然它比较短,但对于我来说比使用后代或自我轴还要笨拙。
'/ jcr:root/content/documents/folder-name |/jcr:root/content/documents/folder-name/*'什么也不选。同样也适用于'// content/documents/folder-name | //内容/文档/文件夹名称// *'。 '// content/documents/folder-name'不包含后代。 –
也许你最好发布样本XML和你期待的确切结果,以便我们知道你想要做什么。您评论中的XPath现在包含名称空间前缀,这是潜在问题的另一个可能来源,我们无法在没有看到您的XML的情况下进行诊断。 – kjhughes
我想要,但它是一个巨大的文件与NDA的东西在里面。当我有几分钟的时间时,我会尝试让事情更近一些。 –