<record>
<node_1>
<value_1_0>5</value_1_0>
<value_1_1>0</value_1_1>
<value_1_2>10</value_1_2>
<value_1_3>8</value_1_3>
</node_1>
.................................
.................................
<node_63>
<value_63_0>1</value_63_0>
<value_63_1>99</value_63_1>
<value_63_2>53</value_63_2>
<value_63_3>5</value_63_3>
</node_63>
</record>
问题陈述 : 如何为这两种情况编写高效的 XPath 表达式?
如果任何节点的值不为零,我需要检查上一个和下一个节点的特定子节点的值是否不为零。 即,如果 node_50/value_50_0 不为零,则 node49/value_49_0 和 node51/value_51_0 也应为非零。同样,对于其余情况。
接下来,它应该将备用节点的值相加,即 node_1/value_1_0 + node_3/value_1_0 + ... + node_63/value_1_0。同样,对于value_1_1,...,value_63_1等等。
我想知道是否有任何"for 循环"为每个索引提供计数器变量,以便 XPath 表达式在这两种情况下都很简单?
伪代码:
for(i=1; i<64; i++)
for(j=0;j<4;j++)
if (node_i/value_i_j !=0)&& (node_i-1/value_i-1_j !=00)&&(node_i-1/value_i-1_j!=0)
True
else
False
end
end
使用
let $alternate-nodes := /record/*[position() mod 2 = 1]
for $i in (1 to count($alternate-nodes[1]/*))
return
sum($alternate-nodes/*[position() eq $i])
应该计算总和。当然,只有当元素名称确实像输入中一样复杂时,才需要使用for $i in
,其中每个元素的名称中都有一个或两个索引号。
对于零或非零值的测试,应该可以例如
let $nodes := /record/*
for $i in (1 to count($nodes[1]/*))
return every $value in $nodes/*[position() eq $i] satisfies $value != 0
返回布尔值序列。