我尝试创建一个包含文档列表的页面,并将过滤添加到列表中。 文档结构如下所示:
/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
的自有属性进行过滤可以正常工作。
我该如何解决?
答案 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
授予读取权限后,问题就解决了。