ОШИБКА - Обязательный тип элемента первого операнда '/' - это node ();предоставленное значение имеет тип элемента xs: untypedAtomic - PullRequest
0 голосов
/ 18 мая 2018

Вопрос. Найдите общее количество книг, опубликованных каждым издателем.Укажите издателя и общее количество опубликованных книг.Вложите результат издателя с элементом publisher и общее количество книг с элементом count.(Подсказка: читайте больше о различных значениях)

Код XML:

<catalog>
    <book id="bk103">
      <author>
        <first>Corets</first>
        <last>Eva</last>
      </author>
      <title>Maeve Ascendant</title>
      <genre>Fantasy</genre>
      <price currency="AU$">5.95</price>
      <publisher>Apress</publisher>
      <publish_date>2000-11-17</publish_date>
      <description>After the collapse of a nanotechnology 
      society in England, the young survivors lay the 
      foundation for a new society.</description>
      <keywords/>
   </book>
   <book id="bk104">
      <author>
        <last>Corets</last>
        <first>Eva</first>
      </author>
      <title>Oberons Legacy</title>
      <genre>Fantasy</genre>
      <price currency="AU$">6.95</price>
      <publisher>Apress</publisher>
      <publish_date>2001-03-10</publish_date>
      <description>In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant.</description>
      <keywords>
        <keyword>post-apocalypse</keyword>
      </keywords>
   </book>
   <book id="bk105">
      <author>
        <last>Corets</last>
        <first>Eva</first>
      </author>
      <title>The Sundered Grail</title>
      <genre>Fantasy</genre>
      <price>15.95</price>
      <publisher>Morgan Kaufman</publisher>
      <publish_date>2001-09-10</publish_date>
      <description>The two daughters of Maeve, half-sisters, 
      battle one another for control of England. Sequel to 
      Oberons Legacy.</description>
      <keywords/>
   </book>
</catalog>

Мой ответ:

for $b in distinct-values(//book/publisher)
let $c := count(//book[publisher = $b])
return 
<publish>
<publisher>{$b/publisher}</publisher>
<count>$c</count>
</publish>

Ошибка, которую я получаю: ERROR - Required item type of first operand of '/' is node(); supplied value has item type xs:untypedAtomic

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Группировка обычно будет более эффективной:

for $book-group in //book
group by $publisher := $book-group/publisher
return <publish>
  <publisher>{ $publisher}</publisher>
  <count>{ count($book-group) }</count>
</publish>

Обратите внимание, что функция fn:distinct-values преобразует узлы в атомарные значения.Это означает, что вы будете использовать связь с исходным узлом.

0 голосов
/ 18 мая 2018

for $b in distinct-values(//book/publisher) привязывает переменную b к каждому элементу в последовательности строк, которую возвращает distinct-values, поэтому для вывода этой строки просто используйте <publisher>{$b}</publisher>.У вас нет узла для использования пути с /.

. Возможно, вы захотите использовать группировку вместо

for $b in catalog/book
group by $pub := $b/publisher
return 
    <publish>
      <publisher>{$pub}</publisher>
      <count>{count($b)}</count>
    </publish>

https://xqueryfiddle.liberty -development.net/ bFukv8b

, если вы не ограничены версией или диалектом XQuery, где это не поддерживается.

...