gpt4 book ai didi

xpath - XPath 中艾弗森括号最简单的语法是什么?

转载 作者:行者123 更新时间:2023-12-03 17:03:14 29 4
gpt4 key购买 nike

我想在 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 语法。

XPath 2.0

您的表达式需要更少的括号:

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

让我们看看使用新的 XPath 3.0 语法是否可以变得更简单:

let $Iv := function($i) { number(boolean($i)) }
return X + $Iv(EXPR) * Y

使用 XQuery 和 XSLT,还有 XPath,您可以全局声明此变量,这会将表达式更改为:

X + $Yv(EXPR) * Y

但是您仍然需要处理括号,但请继续阅读...

XPath 3.1

在 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com