XPath是否支持变量的概念?
我的用例是当我需要在一次进攻中使用一次长XPath表达式时。
例如在XPath 1.0中(其中没有lower-case()
函数),我想评估字符串的小写并在表达式中使用它。而不是写:
//*[
contains(
@text,
translate(
'My String',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'
)
)
and not (
./descendant::*[
contains(
@text,
translate(
'Some String',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'
)
]
)
]
我想写一些类似的东西:
$myLowerCaseString = translate(
'My String',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'
)
//*[
contains(
@text,
$myLowerCaseString
)
and not (
./descendant::*[
contains(
@text,
$myLowerCaseString
]
)
]
(注意:此场景可能有不同的解决方案。我正在为多次使用相同复杂的String / Boolean / Node / NodeSet评估的场景寻找通用解决方案。)
答案 0 :(得分:1)
不在纯XPath 1.0中,没有。您必须评估一个表达式,然后使用XPath库提供的任何机制将结果作为变量绑定到第二个表达式。
但是,在一个表达式中多次复制相同的translate()
调用并不一定意味着它将被多次评估,一些处理器将能够识别重复的子表达式将始终产生相同的结果并优化以仅评估一次。