2016-03-06 62 views
4

我想返回的每时间表也警告数L1和L0项目的数量,也按计划。为什么XQuery表达式返回错误的元素数?

它实际上是一个“数如果”的情况。

我尝试下面的XQuery,它计数L1,L0和警告罚款,但不指望所有的警告,而不是只与value = "yes"的人。

xquery version "3.0"; 

let $nl := "
" 
let $quote := """ 
let $pipe := "|" 
let $nodecount := 0 

for $profiles in doc("maik test.xml")/PROFILE 
for $schedule in $profiles/SCHEDULE 
let $schedulename := $schedule/@name 
group by $schedulename 
return ($nl, 
$schedulename, $pipe, "L0 count:", count($schedule/L0), 
$pipe, "L0 Warnings:", count($schedule/L0/ATTRIBUTE[@NAME = "Warnings"]/VALUE/string() = "Yes"), 
$pipe, "L1 count:", count($schedule/L0/L1), 
$pipe, "L1 Warnings:", count($schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE/string() = "Yes")) 

示例XML:

<?xml version="1.0" encoding="UTF-8"?> 
<PROFILE name="profile1"> 
    <SCHEDULE name="schedule1"> 
     <L0> 
      <ATTRIBUTE NAME="Warnings"> 
       <VALUE>No</VALUE> 
      </ATTRIBUTE> 
      <L1> 
       <ATTRIBUTE NAME="Warnings"> 
        <VALUE>No</VALUE> 
       </ATTRIBUTE> 
      </L1> 
      <L1> 
       <ATTRIBUTE NAME="Warnings"> 
        <VALUE>No</VALUE> 
       </ATTRIBUTE> 
      </L1> 
      <L1> 
       <ATTRIBUTE NAME="Warnings"> 
        <VALUE>Yes</VALUE> 
       </ATTRIBUTE> 
      </L1> 
      <L1></L1> 
     </L0> 
     <L0> 
      <ATTRIBUTE NAME="Warnings"> 
       <VALUE>No</VALUE> 
      </ATTRIBUTE> 
      <L1></L1> 
     </L0> 
    </SCHEDULE> 
    <SCHEDULE name="schedule2"> 
     <L0> 
      <L1></L1> 
      <L1></L1> 
      <L1></L1> 
      <L1></L1> 
     </L0> 
     <L0> 
      <L1></L1> 
     </L0> 
     <L0> 
      <L1></L1> 
      <L1></L1> 
      <L1></L1> 
     </L0> 
    </SCHEDULE> 
</PROFILE> 
+0

+1对于包含示例输入的一个好问题,您尝试过的d明确的问题陈述。对于一个完美的问题,还要添加当前(错误)和期望的输出 - 但问题已经完全好了。 –

+0

其实我对这个问题有问题。当你的日程安排名称是唯一的时,你为什么按计划名称分组?你是否试图编写一个查询来处理日程安排名称不唯一的输入?如果你是这样的话,那么在这种情况下你不期望输出什么。 –

+0

@MichaelKay,没有分组我的计数功能将无法正常工作?我想知道每个计划的“警告值=是”的节点数量。 – Maik

回答

5

其实,你还指望在L0-警告错误的 - 但一个偶然的机会,他们的结果是正确的。

尝试返回$schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE/string() = "Yes"(无聚集),以获得一种感觉什么错误。这个子查询返回一个布尔值,如果左侧的任何值与右侧的任何值(在这种情况下,只有一个值)匹配,则该值为true。随着换句话说,如果警告的任何Yes,该声明得到true。如果没有匹配,则返回false。在XQuery中,=具有集合语义。现在

,您计算的结果数,这 - 不管布尔结果 - 是1

包裹起来,有两个问题中的代码:

  • ,如果你想比较单一的元素,不要使用=,使用eq,而不是(也有lqgqlegene<><=>=!=)。
  • 不要比较结果序列(它将返回一个布尔值),而是使用谓词对其进行过滤。

为L0警告一个适当的子查询会

count($schedule/L0/ATTRIBUTE[@NME = "Warnings"]/VALUE[string() eq "Yes"]) 

,同样为L1警告:

count($schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE[string() eq "Yes"]) 
+0

感谢您的回答和努力!它现在非常有意义。我没有意识到'VALUE [string()eq“是”])'语法。非常好! Danke undGrußaus Hamburg! – Maik

0

要在这里非常齐全:这是现在正常工作中的XQuery :

xquery version "3.0"; 

let $nl := "&#10;" 
let $pipe := "&#124;" 

for $profiles in doc("maik test.xml")/PROFILE 
for $schedule in $profiles/SCHEDULE 
let $schedulename := $schedule/@name 
group by $schedulename 
return ($nl, 
$schedulename, $pipe, "L0 count:", count($schedule/L0), 
$pipe, "L0 Warnings:", count($schedule/L0/ATTRIBUTE[@NAME = "Warnings"]/VALUE[string() eq "Yes"]), 
$pipe, "L1 count:", count($schedule/L0/L1), 
$pipe, "L1 Warnings:", count($schedule/L0/L1/ATTRIBUTE[@NAME = "Warnings"]/VALUE[string() eq "Yes"])) 
相关问题