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

时间:2017-01-17 20:37:22

标签: xpath jcr hippocms

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

/content/documents/web/sale-exclusives/
    <node name> [web:saleexclusive]
        web:exclusive [web:exclusive] (@web:year)

因此,类型为web:saleexclusive的根文档具有属性web:exclusive的复合子类型web:year。 我想根据其子化合物节点的web:saleexclusive属性过滤web:year类型的文档。

为了实现这一点,我扩展EssentialsListComponent并覆盖contributeAndFilters这样的方法(仅用于测试):

@Override
protected void contributeAndFilters(List<BaseFilter> filters, HstRequest request, HstQuery query) {
    Filter filter = query.createFilter();
    try {
        filter.addGreaterOrEqualThan("web:exclusive/web:year", 1900L);
        filters.add(filter);
    } catch (FilterException e) {
        LOGGER.error("", e);
    }
}

问题在于我得到一个空的结果,尽管有web的文件:年份&gt; 1900.如果没有过滤器,我会在sale-exclusives下获取所有文件。

上面的过滤器产生以下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的自有属性进行过滤可以正常工作。

我该如何解决?

2 个答案:

答案 0 :(得分:1)

addGreaterOrEqualThan运算符使用基于名称的元素。在您的情况下,您要选择节点的属性,在XPATH中始终以 @ 符号作为前缀。

尝试使用以下表达式:

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

您始终可以在存储库servlet界面(http://localhost:8080/cms/repository/)中试验XPath查询。

答案 1 :(得分:0)

通过@Jeroen帮助,我找到了解决方案。

同样的问题是here

  

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

     

2)AccessManager将文档下面的节点视为有点不同:如果节点位于允许用户阅读的Document下面,则允许您根据AccessManager读取该Document的子节点,即使您执行此操作也是如此没有在域规则中配置

     

上述两条规则是矛盾的。你可以修复&#39;你自己通过为liveuser添加域,允许他读取hippo:compound和hippostd:html类型的节点。

解决方案在最后一段。添加安全域并向liveuser授予读取权限后,问题就解决了。

Useful documentation about security domains