- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 XPath 表达式中使用 Iverson 括号(即映射 true => 1,false => 0)。
示例:而不是书写
someNumber+(if(elem1/elem2[@attr='123'])then(1)else(0)))*someOtherNumber
我想写(但不知何故没有“艾弗森”)
someNumber+Iverson(elem1/elem2[@attr='123'])*someOtherNumber
以下方法不起作用:
someNumber+[elem1/elem2[@attr='123']]*someOtherNumber
转换为 bool 值:
someNumber+boolean(elem1/elem2[@attr='123'])*someOtherNumber
是否有比“if(...)then(1)else(0)”或“boolean(...)”更简单的语法?
最佳答案
有趣的是,在 XPath 中您已经使用了 Iverson bracket syntax 的一个版本带有 [@attr='123']
或 [@attr]
中的谓词,如果 EBV 为 true,则返回 true。但如果它计算结果为数字,它将返回序列中的第 n 项。
为了方便讨论,为了简洁起见,我们将表达式 elem1/elem2[@attr='123']
替换为 EXPR
,其余部分如下:
X + EXPR * Y
其想法是尽可能接近 EXPR 的 Iverson 语法。
您的表达式需要更少的括号:
X + if(EXPR) then 1 else 0 * Y
这也可以写成如下,假设EXPR
的假值是一个空序列:
X + (EXPR, 1, 0)[2] * Y
Is there a more simple syntax than "boolean(...)"?
您建议使用 boolean(EXPR)
函数,但正如您在评论中提到的,这不起作用,您需要将其转换为数字,例如:
X + number(boolean(EXPR)) * Y
我认为 XPath 2.0 中最短的版本是空序列消除方法,但它可能并不总是有效,它需要第一项返回空序列。
如果您有一个将元素设置为 bool 值的验证处理器,您可以使用:
X + number(EXPR) * Y
或者,如果输入有效值为 0 和 1 的数字,则:
EXPR
让我们看看使用新的 XPath 3.0 语法是否可以变得更简单:
let $Iv := function($i) { number(boolean($i)) }
return X + $Iv(EXPR) * Y
使用 XQuery 和 XSLT,还有 XPath,您可以全局声明此变量,这会将表达式更改为:
X + $Yv(EXPR) * Y
但是您仍然需要处理括号,但请继续阅读...
在 3.1 中,arrow operator has been introduced ,这使得您的原始示例可以写为:
X + EXPR=>boolean()=>number() * Y
鉴于我们现在有一个带有函数项的全局变量,我们可以这样做:
X + EXPR=>$Iv() * Y
既然给匿名函数设置一个全局变量无非就是创建一个函数,所以我们也可以在XQuery或者XSLT中声明一个函数。像这样的东西:
X + EXPR=>i:v() * Y
关于xpath - XPath 中艾弗森括号最简单的语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32502220/
我是一名优秀的程序员,十分优秀!