Xpath - 使用条件搜索根,使用条件搜索根

时间:2014-09-03 16:01:29

标签: xpath jcr

我有这样的结构:

<sv:a>
 <sv:b sv:name="one"/>
 <sv:b sv:name="two"/>
   <sv:c sv:name="exclude"/>
 <sv:b sv:name="error"/>
<sv:a>

我正在尝试获取所有内容和b,但从搜索中排除任何c的内容。

到目前为止,我的xpath查询

//*[not(name()='error') and jcr:contains(*, 'searchInput')]

我想在此基础上添加一些内容,&#34;不要给我任何名为exclude&#34;的节点。或者更好的方法是将#34;从搜索中排除任何名为exclude的节点&#34;。我不确定我是否可以使用最初使用// *的路径来做,并且只是以不同的方式过滤。我知道我不能不说(name()=&#39; exclude&#39;)因为它只查看根目录下的一个级别,只排除该级别的节点。

有没有办法在下面再搜索1个级别,并按名称排除某些节点,或搜索整个文档中的所有内容并排除特定名称的节点?

我不确定这是否重要,但我正在使用CMS Magnolia并尝试进行网站搜索。我使用jcr sql2达到了限制,就我在研究中发现的那样,我不能做我想做的事情。

修改

根据答案和评论,以下是我现在正在看的内容:

//*[not(@sv:name='exclude' or @sv:name='error') and jcr:contains(*, 'searchInput)]

我似乎仍然正在排除&#39;排除&#39;结果所以我必须要么不要注册&#s; sv:&#39;正确或缺少查询中的某些内容,以排除搜索中的某些结果。

2 个答案:

答案 0 :(得分:1)

  

我想在此基本上添加一些内容,“不要给我任何名为exclude的节点”

这很简单:可以通过exclude轴选择名为self的节点(元素),
使用*[self::exclude]。推论:未命名exclude的元素是*[not(self::exclude)]

但我认为你没有提到元素名称。您的输入中没有任何<exclude>个元素。

您实际上似乎是指属性

//*[not(@sv:name = 'error' or @sv:name = 'exclude') and jcr:contains(*, 'searchInput')]

答案 1 :(得分:0)

  

我正在尝试获取所有内容和b,但从搜索中排除任何c的内容。

你不能,至少不是纯XPath。 XPath是从XML树中选择节点的语言,而不是用于构建不同的新树。 XPath表达式可以选择a,也可以不选择a,但它不能为您提供只有一些的 a元素原始a的孩子而不是其他孩子。