Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 按复合字段的属性查询文档失败_Xpath_Jcr_Hippocms - Fatal编程技术网

Xpath 按复合字段的属性查询文档失败

Xpath 按复合字段的属性查询文档失败,xpath,jcr,hippocms,Xpath,Jcr,Hippocms,我尝试创建一个包含文档列表的页面,并将过滤添加到列表中。 文档结构如下所示: /content/documents/web/sale-exclusives/ <node name> [web:saleexclusive] web:exclusive [web:exclusive] (@web:year) 问题是我得到的结果是空的,尽管有web:year>1900的文档。如果没有过滤器,我将获得销售独家服务下的所有文档 上面的筛选器生成以下XPath查询: /

我尝试创建一个包含文档列表的页面,并将过滤添加到列表中。 文档结构如下所示:

/content/documents/web/sale-exclusives/
    <node name> [web:saleexclusive]
        web:exclusive [web:exclusive] (@web:year)
问题是我得到的结果是空的,尽管有web:year>1900的文档。如果没有过滤器,我将获得
销售独家服务下的所有文档

上面的筛选器生成以下XPath查询:

//*[(@hippo:paths='79a713cf-294d-4e99-9d63-fc50db10e43f') and (@hippo:availability='live') and not(@jcr:primaryType='nt:frozenNode') and (web:exclusive/web:year >= 1900)] order by @jcr:score descending
通过
web:saleexclusive
的自身属性进行过滤效果良好


如何解决这个问题?

addGreaterOrEqualThan操作符使用基于名称的元素。在本例中,您希望选择节点的属性,在XPATH中,该属性的前缀始终为@符号

尝试使用以下表达式:

try {
        filter.addGreaterOrEqualThan("web:exclusive/@web:year", 1900L);
        filters.add(filter);
    } catch (FilterException e) {
        LOGGER.error("", e);
    }

您始终可以在存储库servlet接口()中尝试XPath查询。

借助@Jeroen help,我找到了解决方案

同样的问题也在讨论中:

1) 根据域配置,“liveuser”对poll:poll类型的节点没有读取权限。由于域用于创建授权查询,因此此授权查询不包含poll:poll类型的节点,因此它们不会显示在搜索结果中

2) AccessManager对文档下面的节点的处理有点不同:如果某个节点位于允许用户读取的文档下面,则也允许您根据AccessManager读取该文档的子节点,即使您没有在域规则中配置该节点

上述两条规则相互矛盾。您可以通过为liveuser添加允许其读取类型为hippo:component和hippostd:html的节点的域来“修复”它

解决办法在最后一段。添加安全域并向
liveuser
授予读取权限后,问题得到解决


year属性的类型是date还是long?类型是long。我尝试使用“@”,但结果相同。非常感谢您提供的url,我在问题中粘贴的查询可以从存储库servlet界面正确运行,无论是否使用“@”。我的下一个假设是Lucene索引有问题。顺便说一句,存储库servlet接口的默认url为http://:/cms/repository如果您没有通过HST获得结果,则可能是由于不正确的授权级别造成的。在存储库界面中,您通常使用管理员用户(所有节点上的所有权限)登录,其中HST具有预览或实时“用户”,可以访问处于预览或实时状态的文档。如果出现授权级别问题,我想如果不添加过滤器,我将无法获得结果,实际上,当我以
liveuser
身份登录/cms/repository界面时,只有当我查询所有文档或按web:saleexclusive-own-attributes进行过滤时,我才会得到结果。但是如果我添加
和(web:exclusive/@web:year>=1900)
结果集是空的(使用
admin
我会得到正确的结果)。
liveuser
是否可以访问文档,但不能访问其复合子级?
try {
        filter.addGreaterOrEqualThan("web:exclusive/@web:year", 1900L);
        filters.add(filter);
    } catch (FilterException e) {
        LOGGER.error("", e);
    }