Новичок в Xquery пытается создать функцию для библиотечного модуля - PullRequest
1 голос
/ 24 апреля 2020

Я работаю над заданием xquery, и я не понимаю, правильно ли я это делаю, я делаю модуль библиотеки для последующих xqueries. текущий шаг, на котором я застрял, это то, что мне нужно создать функцию с именем GetAthleteMedals, которая возвращает медали, выигранные указанным спортсменом c, с единственным параметром с именем aID, который хранит идентификатор althletes, тогда в рамках этой функции мне нужно сделать FLOWR запрос, который проходит через каждую медаль из документа с медалями, AthID которого равен значению параметра aID.

xquery version "1.0";

module namespace olym="http://www.example.com/olympics";

declare variable $olym:athletes := doc('athletes.xml')/athletes/athlete;
declare variable $olym:discipline := doc('discipline.xml')/disciplines/discipline;
declare variable $olym:events := doc('events.xml')/events/event;
declare variable $olym:medals := doc('medals.xml')/medals/medal;
declare variable $olym:sports := doc('sports.xml')/sports/sport;

(: 
   New Perspectives on XML, 3rd Edition
   Tutorial 9
   Case Problem 3

   Library module for olympics queries

   Author:  Zavier Vaidya   
   Date:  4/21/20     
   Filename:   olym_functions.xqm

 :)

declare function olym:GetAthleteMedals($aID as xs:string) as element()* 
{
  let $athleteId := doc('athletes.xml')//athlete[athID=$aID]
  let $medals := doc('medals.xml')//medal

  return $medals[@medalId=$athleteId/@medalId]

  <athIDMedals medal="athID">{
  for $medals in doc('medals.xml')/medals/medal
    where $medals/medal='athID'
    return $medal
    }</athIDMedals>
};

пример медалей. xml структура

<medals>
   <medal athID="A3577" eventID="E6" olympicID="Summer1988" place="2-Silver"/>

пример спортсменов. xml структура

<athletes>
   <athlete athID="A100" country="MAR" gender="Male" name="ACHIK, Mohamed"/>

1 Ответ

2 голосов
/ 24 апреля 2020

Здесь довольно много неправильных вещей.

let $athleteId := doc('athletes.xml')//athlete[athID=$aID]
  • athID - это атрибут, поэтому его нужно записать @athID

  • переменная является элементом атлета, а не значением ID, поэтому имя переменной выбрано неправильно.

    return $medals[@medalId=$athleteId/@medalId]
  • Ни athlete, ни medal имеет атрибут @medalId; оба имеют атрибут @athID.
<athIDMedals medal="athID">{
         for $medals in doc('medals.xml')/medals/medal
           where $medals/medal='athID'
           return $medal
           }</athIDMedals>
  • Мне не ясно, что вы намереваетесь вернуть функцию. Это медаль из входного документа, как подразумевается в вашем предложении return? Или это недавно построенный объект athIDMedals. В настоящее время вы, похоже, пытаетесь вернуть оба, что не очень хорошо работает.

  • Вам нужны фигурные скобки в medal="{$athleteID}" (я предполагаю, что вы хотите получить значение быть здесь)

  • $medals/medal='athID' Переменная $medals содержит набор элементов medal. Элемент medal не имеет дочернего элемента с именем medal, и в этом случае элемент медали никогда не будет равен буквальной строке 'athID'.

  • return $medal нет переменной с именем $medal.

...