xpath
  • jcr
  • 2014-09-03 38 views 0 likes 
    0

    我有这样的结构:的Xpath - 用条件和以下条件根搜索根

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

    我试图让所有的A和B的,但是从我的搜索中排除任何C的含量。

    我有这样的结构,到目前为止我的XPath查询

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

    我想补充一点,以这实质上说,“不给我的名字命名的任何节点排除”或者一个更好的方式把它是“从搜索中排除名为exclude的任何节点”。我不确定我是否可以使用最初使用//的路径并仅以不同的方式进行过滤。我知道我不能仅仅说不(name ='exclude'),因为它只查看根以下的一个级别,只排除该级别的节点。

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

    林不知道它的问题,但我工作的CMS玉兰,并试图进行网站搜索。我在使用jcr sql2时遇到了一个限制,并且无法按照我在研究过程中发现的方式执行此操作。

    编辑:

    基于答案和评论,下面是我在看现在:

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

    我似乎仍然得到“排除”的结果,所以我必须要么不注册'sv:'正确或缺少查询中需要排除搜索结果的内容。

    +1

    你使用'name()',但它可能是你实际上是'@ name'? – Tomalak 2014-09-03 16:08:49

    +0

    我刚刚检查,似乎任何工作。可能@name的表现会更好,但我不会知道他们是 – wondergoat77 2014-09-03 16:10:40

    +0

    他们是不同的东西。 'name()'给你手头节点的名字。您没有名为'exclude'的节点。但是你所拥有的是名为'b'的节点,它带有*属性*,名为'name',值为''exclude“'。你可以用'@'获得属性。 – Tomalak 2014-09-03 16:12:25

    回答

    1

    我想补充一点,以这实质上说,“不给我的名字命名的任何节点排除”

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

    但我想你不会引用元素名称。您的输入中没有任何<exclude>元素。

    你实际上似乎指的是属性

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

    我试图让所有的A和B的,但是从我的搜索中排除任何C的含量。

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

    +0

    这就是我所害怕的。我想知道是否有办法以另一种方式完成我正在做的事情。 – wondergoat77 2014-09-03 16:20:42

    +0

    @ wondergoat77将一个XML结构转换为另一个XML结构,您可以使用XSLT或XQuery等更高级的语言,但我不知道是否有任何特定于CMS的内容更容易。 – 2014-09-03 16:23:32

    +0

    @ wondergoat77正如我所看到的,我不怀疑你想要构建另一个输出树;你只是想从搜索中排除某些节点。 XPath绝对有可能。 – Tomalak 2014-09-03 16:23:33

    相关问题