【发布时间】:2014-12-08 21:53:16
【问题描述】:
我有一个如下类型的 XPATH 表达式,它预期会返回一个布尔值:
xs:boolean(expression1 or expression2 or expression3)
如果expression1 返回true,是否会计算其他表达式?
在任何情况下,任何人都可以指出如何在 XPATH 中高效地编写复杂逻辑表达式的示例吗?
顺便说一句:我在 MarkLogic 上运行 XPATH。
【问题讨论】:
我有一个如下类型的 XPATH 表达式,它预期会返回一个布尔值:
xs:boolean(expression1 or expression2 or expression3)
如果expression1 返回true,是否会计算其他表达式?
在任何情况下,任何人都可以指出如何在 XPATH 中高效地编写复杂逻辑表达式的示例吗?
顺便说一句:我在 MarkLogic 上运行 XPATH。
【问题讨论】:
在 XPath 1.0 中定义了表达式按从左到右的顺序计算,直到其中一个返回 true。
但是表达式中存在 xs:boolean(这是多余的)表明您正在使用 XPath 2.0,并且允许 XPath 2.0 处理器以任何顺序评估子表达式。这是为了允许数据库风格的优化:其中一个子表达式可能比其他子表达式执行得更快(或更可能返回 true),这可能是因为数据库索引,所以优化器将首先评估那个子表达式。但是任何体面的优化器都会在第一个计算结果为“真”的表达式之后停止计算。
我不能具体告诉你 MarkLogic 是做什么的。
对于其他尝试此操作的人,XPath 中的“或”运算符必须为小写。
【讨论】:
鉴于 Michael Kay 关于优化的 cmets,我不能确定 MarkLogic 是选择表达式先评估还是从左到右进行评估,但您可以看到特定 XPath 是如何评估的。在查询控制台(通常是 localhost:8000/qconsole)中,输入一个表达式,单击配置文件选项卡,然后运行。
//foo[xs:boolean(1 = 1 or 2 = 3)]
配置文件选项卡显示“1 = 1”已评估,“2 = 3”未评估。
【讨论】: