如果我们有一个xpath if语句:
if(test-expression) then (expresion) else (someOtherExpression),
我们说test-expression是一个具有某些条件的路径(例如// Element1 [text()!='']) 我们有多个Element1节点,if语句是否进入每个Element1节点并检查条件或仅检查条件?
示例:
<Element1></Element1>
<Element1>Test</Element1>
如果声明:
if(//Element1[text()!='']) then ('result1') else ('result2')
这会返回第一个元素的result2,然后去检查第二个元素和return1,或者这不是xpath的工作原理吗?
我是xpath的新手,我无法在任何地方找到这些信息。
答案 0 :(得分:1)
这会返回第一个元素的result2,然后去检查第二个元素和return1,或者这不是xpath的工作原理吗?
不,它将评估测试表达式,将其转换为布尔值,然后如果测试为真,则返回result1
,如果为false,则返回result2
。
对于这个具体的例子
//Element1[text()!='']
是一个表达式,它将返回所有Element1
个节点的序列,这些节点至少有一个非空的文本节点子节点 - 它会找到<Element1>Test</Element1>
和<Element1>Te<br/>st</Element1>
,但< em> not <Element1><span>Test</span></Element1>
因为Element1
根本没有任何文本节点子节点,只有一个元素节点(span
)。如果您想要抓住最后一个示例,那么您可以使用. != ''
代替text() != ''
。
The rule to convert a sequence of nodes to boolean是空序列为假,非空序列为真。因此整体表达
if(//Element1[text()!='']) then ('result1') else ('result2')
如果文档中至少有一个result1
元素具有非空文本节点子元素,将返回Element1
,否则将返回result2
。
如果您想依次测试每个Element1
并为每个节点返回result1
/ result2
的序列,那么您需要{{1表达式
for