选择元素及其后代

时间:2017-08-14 18:58:10

标签: xpath jcr

我试图从带有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代替。不过,我有同样的问题。

2 个答案:

答案 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::*)但是虽然它更短,但对我来说似乎比使用后代或自身轴更笨拙。