XQuery - возвращает уникальные значения без различных значений - PullRequest
1 голос
/ 10 января 2012

Я пришел в полное состояние по поводу определенной проблемы XQuery.Вначале у меня не было нескольких экспонатов с одним и тем же названием в XML-документе - когда я изменил, я заметил определенную проблему: в результате (в XQuisitor) все названия направляющих отображаются дважды или трижды для каждого уникального экспоната., в зависимости от того, сколько экспонатов имеют одно и то же название.

Я понятия не имею, почему и был бы признателен за ввод.

Вот код XQuery, который я пробовал:

for $u in (//Exhibit/@title)
let $guide := for $g in //Guide[../@title=$u]/@gname return element Guide {$g}
return element Exhibit {attribute Title {$u}, $guide }

Пример XML-документа:

<?xml version="1.0" encoding="UTF-8"?>
<Exhibits>
<Exhibit title = "Renaissance"  sdate= "2011-09-05"  
edate= "2012-02-05"  sarea = "2400">
<Guide gname = "John Smith" >
<Lang sname ="English"/>
<Lang sname ="German"/>
</Guide>
<Guide gname = "Weber Schneider">
<Lang sname = "German"/>
</Guide>
<Guide gname = "Robert Lundstrom">
<Lang sname = "Swedish"/>
</Guide>
<Guide gname = "Paula Munoz">
<Lang sname = "Spanish"/>
<Lang sname = "German"/>
<Lang sname = "English"/>
</Guide>
</Exhibit>
<Exhibit title = "Renaissance"  sdate= "2011-10-06" 
edate= "2011-11-26" sarea = "2000">
<Guide gname = "John Smith">
<Lang sname ="English"/>
<Lang sname ="German"/>
</Guide>
<Guide gname = "Paula Munoz">
<Lang sname = "Spanish"/>
<Lang sname = "German"/>
<Lang sname = "English"/>
</Guide>
</Exhibit>
</Exhibits>

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Использование :

let $vals := /*/Exhibit/@title
  return
     for $t in  $vals[index-of($vals, .)[1]]
       return
        element Exhibit 
           { attribute Title {$t},
             let $gvals := /*/Exhibit[@title eq $t]/Guide/@gname
              return
                for $gname in $gvals[index-of($gvals, .)[1]]
                  return
                    element Guide {attribute gname {$gname}} 
           }

При применении к этому документу XML (предоставленному, несколько более сложному) :

<Exhibits>
  <Exhibit title = "Renaissance"  sdate= "2011-09-05"   edate= "2012-02-05"  sarea = "2400">
    <Guide gname = "John Smith" >
      <Lang sname ="English"/>
      <Lang sname ="German"/>
    </Guide>
    <Guide gname = "Weber Schneider">
      <Lang sname = "German"/>
    </Guide>
    <Guide gname = "Robert Lundstrom">
      <Lang sname = "Swedish"/>
    </Guide>
    <Guide gname = "Paula Munoz">
      <Lang sname = "Spanish"/>
      <Lang sname = "German"/>
      <Lang sname = "English"/>
    </Guide>
  </Exhibit>
  <Exhibit title = "Renaissance"  sdate= "2011-10-06"  edate= "2011-11-26" sarea = "2000">
    <Guide gname = "John Smith">
      <Lang sname ="English"/>
      <Lang sname ="German"/>
    </Guide>
    <Guide gname = "Paula Munoz">
      <Lang sname = "Spanish"/>
      <Lang sname = "German"/>
      <Lang sname = "English"/>
    </Guide>
  </Exhibit>
  <Exhibit title = "Middle Age"  sdate= "2011-10-06"  edate= "2011-11-26" sarea = "2000">
    <Guide gname = "John Smith">
      <Lang sname ="English"/>
      <Lang sname ="German"/>
    </Guide>
    <Guide gname = "Paula Munoz">
      <Lang sname = "Spanish"/>
      <Lang sname = "German"/>
      <Lang sname = "English"/>
    </Guide>
  </Exhibit>
  <Exhibit title = "Middle Age"  sdate= "2011-09-05"   edate= "2012-02-05"  sarea = "2400">
    <Guide gname = "John Smith" >
      <Lang sname ="English"/>
      <Lang sname ="German"/>
    </Guide>
    <Guide gname = "Weber Schneider">
      <Lang sname = "German"/>
    </Guide>
    <Guide gname = "Robert Lundstrom">
      <Lang sname = "Swedish"/>
    </Guide>
    <Guide gname = "Paula Munoz">
      <Lang sname = "Spanish"/>
      <Lang sname = "German"/>
      <Lang sname = "English"/>
    </Guide>
  </Exhibit>
</Exhibits>

желаемый, правильный результат получается :

<Exhibit Title="Renaissance">
   <Guide gname="John Smith"/>
   <Guide gname="Weber Schneider"/>
   <Guide gname="Robert Lundstrom"/>
   <Guide gname="Paula Munoz"/>
</Exhibit>
<Exhibit Title="Middle Age">
   <Guide gname="John Smith"/>
   <Guide gname="Paula Munoz"/>
   <Guide gname="Weber Schneider"/>
   <Guide gname="Robert Lundstrom"/>
</Exhibit>

Объяснение :

Мы используем тот факт, что для последовательности атомарных значений$vals:

$vals[index-of($vals, .)[1]]

создает набор элементов со всеми различными значениями, содержащимися в $vals.

1 голос
/ 10 января 2012

Для каждого уникального экспоната ваш запрос находит все инструкции под любыми экспонатами с тем же именем и показывает их. Если вы хотите только те из текущего, попробуйте этот запрос:

for $e in //Exhibit
let $guide := for $g in $e/Guide/@gname return element Guide {$g}
return element Exhibit {attribute Title { $e/@title }, $guide }

С предоставленным вами входным файлом ваш запрос возвращает:

<Exhibit Title="Renaissance">
  <Guide gname="John Smith"/>
  <Guide gname="Weber Schneider"/>
  <Guide gname="Robert Lundstrom"/>
  <Guide gname="Paula Munoz"/>
  <Guide gname="John Smith"/>
  <Guide gname="Paula Munoz"/>
</Exhibit>
<Exhibit Title="Renaissance">
  <Guide gname="John Smith"/>
  <Guide gname="Weber Schneider"/>
  <Guide gname="Robert Lundstrom"/>
  <Guide gname="Paula Munoz"/>
  <Guide gname="John Smith"/>
  <Guide gname="Paula Munoz"/>
</Exhibit>

, а исправленное дает:

<Exhibit Title="Renaissance">
  <Guide gname="John Smith"/>
  <Guide gname="Weber Schneider"/>
  <Guide gname="Robert Lundstrom"/>
  <Guide gname="Paula Munoz"/>
</Exhibit>
<Exhibit Title="Renaissance">
  <Guide gname="John Smith"/>
  <Guide gname="Paula Munoz"/>
</Exhibit>
...