2011-12-07 10 views
0

を数える私はほとんどの学生が内にある大学を希望DTDXQueryは条件ここで

<!ELEMENT Responses (Student*)> 

<!ELEMENT Student (Response+)> 

    <!ATTLIST Student studentID ID #REQUIRED> 



<!ELEMENT Response (List+)> 

<!ELEMENT List (#PCDATA)> 

    <!ATTLIST List questionID IDREF #REQUIRED> 

です。ネクタイがある場合は、関連付けられたすべての大学を報告します。

let $student := doc("responses.xml")/Responses/Student 

for $dc in distinct-values 
    (for $college in $student/Response/List[@questionID = "college"] 
    return data($college)) 

return <College>{$dc} - number of students: {count($student[Response/List[@questionID = "college"] = data($dc)])</College>) 

count()でエラーが発生しました。条件を数えたいだけです。

私は最大のもの

+0

..マックスは最初の自分自身をカウントし、その後その数を持つすべての大学を見つけるためにそれを使用見つけることによって、ビットを微調整することもできますか? (私は閉じた中括弧が見つからないのを目の当たりにして、最後にはかっこで囲まれたかっこがあります)。要素名は直感的ではないので、いくつかのサンプルデータを提供してください。たとえば、大学はどのように表されていますか? –

答えて

1

を選択するか、あなたのコードの最後の行にタイプミスがありますどのように第二の問題。カウントの直前に中括弧がありますが、</College>の前に閉じておらず、</College>の後ろに余分な閉じ括弧があります。

ほとんどの学生に関連付けられている(出席している)大学を取得するには、その数を注文し、その方法で返される最初の項目を取る必要があります。下記のわずかに変更されたコードを参照してください。

注:私はあなたのデータについて少し推測しなければならなかったので、自分で何かを作成しました。実際に同じ最大数の大学が3つありますが、1つだけ返されます。あなたはどのようなエラーメッセージを取得している

let $doc := 
    document { 
     <Responses> 
      <Student studentID="s1"> 
       <Response> 
        <List questionID="college">q1</List> 
        <List questionID="college">q2</List> 
        <List questionID="college">q3</List> 
       </Response> 
       <Response> 
        <List questionID="college">q4</List> 
        <List questionID="college">q5</List> 
        <List questionID="college">q6</List> 
       </Response> 
      </Student> 
      <Student studentID="s2"> 
       <Response> 
        <List questionID="college">q4</List> 
        <List questionID="college">q5</List> 
        <List questionID="college">q6</List> 
       </Response> 
       <Response> 
        <List questionID="college">q7</List> 
        <List questionID="college">q8</List> 
        <List questionID="college">q9</List> 
       </Response> 
      </Student> 
      <Student studentID="s3"> 
       <Response> 
        <List questionID="college">q1</List> 
        <List questionID="college">q2</List> 
        <List questionID="college">q3</List> 
       </Response> 
       <Response> 
        <List questionID="college">q4</List> 
        <List questionID="college">q5</List> 
        <List questionID="college">q6</List> 
       </Response> 
      </Student> 
     </Responses> 
    } 

 

let $student := $doc/Responses/Student 
return (
    for $dc in 
     distinct-values(
      for $college in $student/Response/List[@questionID = "college"] 
      return data($college) 
     ) 
    let $count := count($student[Response/List[@questionID = "college"] = data($dc)]) 
    order by $count descending, $dc ascending 
    return <College>{$dc} - number of students: {$count}</College> 
)[1]