XPath中最简单的Iverson括号语法是什么?

XPath中最简单的Iverson括号语法是什么?,xpath,Xpath,我想在XPath表达式中使用Iverson括号(即映射true=>1,false=>0) 例:代替写作 someNumber+(if(elem1/elem2[@attr='123'])then(1)else(0)))*someOtherNumber 我想写(但不知何故没有“艾弗森”) 以下操作不起作用: someNumber+[elem1/elem2[@attr='123']]*someOtherNumber 铸造到布尔作品: someNumber+boolean(elem1/elem2[@

我想在XPath表达式中使用Iverson括号(即映射true=>1,false=>0)

例:代替写作

someNumber+(if(elem1/elem2[@attr='123'])then(1)else(0)))*someOtherNumber
我想写(但不知何故没有“艾弗森”)

以下操作不起作用:

someNumber+[elem1/elem2[@attr='123']]*someOtherNumber
铸造到布尔作品:

someNumber+boolean(elem1/elem2[@attr='123'])*someOtherNumber
有比“if(…)then(1)else(0)”或“boolean(…)”更简单的语法吗?

Iverson 有趣的是,在XPath中,您已经在
[@attr='123']
[@attr]
中使用了带谓词的版本,如果其EBV为true,则返回true。但是如果它的计算结果是一个数字,它将返回序列中的第n项

在讨论中,为了简洁起见,让我们将表达式
elem1/elem2[@attr='123']
替换为
EXPR
,其余类似:

X + EXPR * Y
这里的想法是尽可能接近EXPR的艾弗森语法

XPath2.0 表达式需要更少的括号:

假设
EXPR
的假值为空序列,也可以这样写:

X + (EXPR, 1, 0)[2] * Y
还有比“boolean(…)”更简单的语法吗

您建议使用
boolean(EXPR)
函数,但正如您在评论中提到的,这将不起作用,您需要将其转换为数字,例如:

X + number(boolean(EXPR)) * Y
我认为XPath2.0中最短的版本是空序列消除方法,但它可能并不总是有效,它需要第一项返回空序列

如果您的验证处理器将元素设置为布尔值,则可以使用:

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中,允许将原始示例编写为:

X + EXPR=>boolean()=>number() * Y
假设我们现在有一个带有函数项的全局变量,我们可以:

X + EXPR=>$Iv() * Y
其他方法 由于将全局变量设置为匿名函数只不过是创建一个函数,因此我们还可以在XQuery或XSLT中声明一个函数。比如:

X + EXPR=>i:v() * Y
艾弗森 有趣的是,在XPath中,您已经在
[@attr='123']
[@attr]
中使用了带谓词的版本,如果其EBV为true,则返回true。但是如果它的计算结果是一个数字,它将返回序列中的第n项

在讨论中,为了简洁起见,让我们将表达式
elem1/elem2[@attr='123']
替换为
EXPR
,其余类似:

X + EXPR * Y
这里的想法是尽可能接近EXPR的艾弗森语法

XPath2.0 表达式需要更少的括号:

假设
EXPR
的假值为空序列,也可以这样写:

X + (EXPR, 1, 0)[2] * Y
还有比“boolean(…)”更简单的语法吗

您建议使用
boolean(EXPR)
函数,但是正如您在注释中提到的,这将不起作用,您需要将其转换为数字,例如:

X + number(boolean(EXPR)) * Y
我认为XPath2.0中最短的版本是空序列消除方法,但它可能并不总是有效,它需要第一项返回空序列

如果您的验证处理器将元素设置为布尔值,则可以使用:

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中,允许将原始示例编写为:

X + EXPR=>boolean()=>number() * Y
假设我们现在有一个带有函数项的全局变量,我们可以:

X + EXPR=>$Iv() * Y
其他方法 由于将全局变量设置为匿名函数只不过是创建一个函数,因此我们还可以在XQuery或XSLT中声明一个函数。比如:

X + EXPR=>i:v() * Y

“false”的意思是表达式的有效布尔值()为false(任何可以作为测试表达式传递给if指令的内容)。@tafit3,如果您需要该限制,那么我建议的快捷方式将不会有帮助,因为获得EBV的唯一可靠方法是,您猜到了,
fn:boolean
。但是,如果您不想这样做,您可以使用XSD和验证处理器,这将使用节点类型,然后将是布尔值,并且您不再需要使用
fn:boolean
函数。@tafit3,如果您可以切换到更新版本的XPath,您可以使用新的箭头运算符或函数项,这可能会帮助你写这个“更简单的”;)。您让我相信,在XPath2.0中,没有比调用
fn:boolean
更简单的方法了。我没有支持模式的XPath处理器(我使用saxon)。我不喜欢
if(x)then(1)else(0)
(x,1,0)[2]
(x=>$b())*3
仅比
布尔值(x)*3
短1个字符。顺便说一句,我检查了XQuery中的
fn:boolean
是不够的,为了得到相同的结果,您必须执行
number(boolean(…)
,否则您会得到错误“没有为类型(xs:boolean,xs:integer)的参数定义算术运算符”。我原以为XPath和XQuery在这种简单的情况下会表现相同。@tafit3,是的,你是对的,这是一个错误,但在XPath中,不是在XQuery中。除非使用XPath,否则您指的是1.0,在这方面它的类型安全性较差。虽然我没有在我的答案中考虑,但是<代码>数字(布尔(…))建议将(全局)变量设置为函数项会使它变短。此外,您还会发现在XPath2.0+和XSLT2.0+代码中大量使用的语法(a、b、c)[1],它是最简单的,也是可读的版本