0
<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
4

1 回答 1

1

使用

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

返回一系列布尔值。

于 2019-08-08T11:05:10.487 回答