我有这样的结构:
<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;正确或缺少查询中的某些内容,以排除搜索中的某些结果。
答案 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
的孩子而不是其他孩子。