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);
}