我试图从带有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
:
//content/documents/folder-name[. | *]
//content/documents/folder-name/[. | *]
显然我在XPath上很糟糕。请帮忙。
编辑:我使用的是//
前缀,因为我没有意识到我可以使用/jcr:root/content
代替。不过,我有同样的问题。
答案 0 :(得分:0)
您可以使用union运算符组合两个XPath:
xpath1 | xpath2
但是,你的第一个XPath,
//content/documents/folder-name
确实选择folder-name
元素,其中包含元素的后代。
如果您希望folder-name
元素在列表中排在第一位,后跟其后代,则可以按如下方式组合:
//content/documents/folder-name | //content/documents/folder-name//*
答案 1 :(得分: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::*)
但是虽然它更短,但对我来说似乎比使用后代或自身轴更笨拙。