XPath / XSLT: последовательность из более чем одного элемента не допускается в качестве первого ключа сортировки - PullRequest
0 голосов
/ 04 ноября 2018

Привет сообщество stackoverflow,

Я пытаюсь упорядочить вложенным атрибутом, но получаю сообщение об ошибке, сообщающее, что

XPTY0004: последовательность из более чем одного элемента не допускается в качестве первого ключа сортировки.

Это конкретно происходит в строке

order by $x/role/@startdate

из следующего кода

<result>{
  for $x in /congress/people/person
  where $x/role[@type = 'sen' and @current = 1 and @state = 'NC']
  order by $x/role/@startdate
  return <senator name="{$x/@name}"/>
 }</result>

Мне интересно, как вы соответствующим образом упорядочите вложенный атрибут.

Edit:

Вот пример кода XML-документа

<congress>
  <people>
    <person birthday="1952-11-09" gender="M" id="B000944" name="Sherrod Brown">
      <role district="13" enddate="1995-01-03" party="Democrat" startdate="1993-01-05" state="OH" type="rep"/>
      <role district="13" enddate="1997-01-03" party="Democrat" startdate="1995-01-04" state="OH" type="rep"/>
      <role enddate="2007-01-03" party="Democrat" startdate="2001-01-03" state="WA" type="sen"/>
      <role enddate="2013-01-03" party="Democrat" startdate="2007-01-04" state="WA" type="sen"/>
      <role current="1" enddate="2019-01-03" party="Democrat" startdate="2013-01-03" state="WA" type="sen"/>
    </person>
    <person>
      ...
    </person>
  </people>
</congress>

1 Ответ

0 голосов
/ 05 ноября 2018

в вашем коде

for $x in /congress/people/person
  where $x/role[@type = 'sen' and @current = 1 and @state = 'NC']
  order by $x/role/@startdate

Я подозреваю (хотя я предполагаю), что вы хотите отсортировать по @startdate из role, который соответствует условию where. Если вы уверены, что есть только одна такая роль, вы можете написать

for $x in /congress/people/person
let $role := $x/role[@type = 'sen' and @current = 1 and @state = 'NC']
where exists($role)
order by $role/@startdate

Если есть вероятность того, что более чем одна роль удовлетворяет предикату, вам все равно нужно как-то указать, по каким датам начала этой роли вы хотите отсортировать.

...