我有一个以下类型的XPATH表达式,它希望返回一个布尔值:
xs:boolean(expression1 or expression2 or expression3)
如果expression1
返回true
,是否会评估其他表达式?
在任何情况下,任何人都可以向我指出在XPATH中如何有效地编写复杂逻辑表达式的例子吗?
BTW:我在MarkLogic上运行XPATH。
答案 0 :(得分:3)
在XPath 1.0中,它定义了从左到右按顺序计算表达式,直到其中一个返回true。
但是表达式中存在xs:boolean(这是多余的)表明您正在使用XPath 2.0,并且允许XPath 2.0处理器以任何顺序评估子表达式。这是为了允许数据库样式优化:其中一个子表达式执行速度可能比其他子表达式更快(或者更可能返回true),这可能是因为数据库索引,因此优化器将首先评估该表达式。但任何体面的优化器都会在第一个表达式结束后停止评估,该表达式的结果为" true"。
我无法具体告诉你MarkLogic的所作所为。
对于其他尝试此操作的人来说,"或" XPath中的运算符必须是小写的。
答案 1 :(得分:2)
根据Michael Kay对优化的评论,我无法确定MarkLogic是选择表达式进行首先评估还是从左向右进行评估,但您可以看到如何评估特定的XPath。在查询控制台(通常为localhost:8000 / qconsole)中,键入表达式,单击“配置文件”选项卡,然后单击“运行”。
//foo[xs:boolean(1 = 1 or 2 = 3)]
配置文件标签显示" 1 = 1"被评估并且" 2 = 3"不是。