Использование операторов if в двух документах XML - PullRequest
0 голосов
/ 02 мая 2018

У меня есть два XML-документа Students.xml и Admission.xml, мне нужен xquery для возврата идентификатора студента и имени студента, которые закончили 30 дней с даты поступления. Я запутался в том, как присоединиться к ним и использовать какое-либо условие, пожалуйста, помогите.

Студент.xml

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<StudentDetails>
    <Student_ID>1</Student_ID>
    <Student_Name>Mark</Student_Name>
</StudentDetails>
<StudentDetails>
    <Student_ID>2</Student_ID>
    <Student_Name>Robin</Student_Name>
</StudentDetails>
<StudentDetails>
    <Student_ID>3</Student_ID>
    <Student_Name>Charlie</Student_Name>
</StudentDetails>
</root>

Admission.xml

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<AdmissionDetails>
    <Admission_ID>1</Admission_ID>
    <Admission_Date>2017-10-06</Admission_Date>
    <Admission_Status>Admitted</Admission_Status>
    <Student_ID>3</Student_ID>
</AdmissionDetails>
<AdmissionDetails>
    <Admission_ID>2</Admission_ID>
    <Admission_Date>2017-04-14</Admission_Date>
    <Admission_Status>Admitted</Admission_Status>
    <Student_ID>2</Student_ID>
</AdmissionDetails>
<AdmissionDetails>
    <Admission_ID>3</Admission_ID>
    <Admission_Date>2017-08-16</Admission_Date>
    <Admission_Status>Admitted</Admission_Status>
    <Student_ID>1</Student_ID>
</AdmissionDetails>

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

for $sid in doc("Student.xml")/root/StudentDetails/Student_ID
for $aid  in doc("Admission.xml")/root/AdmissionDetails/Student_ID
for $x in doc("Admission,xml")/root/AdmissionDetails/Admission_Date
where $sid = $aid and $x >current-date() + xs:dayTimeDuration("P30D")
return  $sid

И это результат

<?xml version="1.0" encoding="UTF-8"?>
<Student_ID>1</Student_ID>
<Student_ID>1</Student_ID>
<Student_ID>10</Student_ID>
<Student_ID>10</Student_ID>

Ответы [ 2 ]

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

Я думаю, вы попадаете в ловушку, думая, что каждый запрос должен быть выражением FLWOR (обычно это признак того, что вы потратили слишком много времени на написание SQL).

Я бы написал так:

    let $S30 := doc("Admission.xml")/*/Admission_Details
        [xs:date(Admission_Date) < current-date() + xs:dayTimeDuration("P30D")]
        /Admission_ID
    return doc("Student.xml")/*/StudentDetails[Student_ID = $S30]
0 голосов
/ 02 мая 2018

Вы можете выполнить итерацию по каждому из StudentDetails в документах Students.xml, а затем отфильтровать, ГДЕ значение StudentDetails/Student_ID равно элементу Student_ID элемента Admission.xml AdmissionDetails и имеет Admission_Date, который соответствует вашим критериям ( вы уверены, что это правильный фильтр даты? В вашем описании указана дата завершения в течение 30 дней с момента поступления, но в данных образца не указана дата завершения, только дата приема ), а затем вернуть Student_ID и Student_Name от тех студентов, которые удовлетворяют условиям условия WHERE.

for $student in doc("Student.xml")/root/StudentDetails
where doc("Admission.xml")/root/AdmissionDetails[
        Student_ID = $student/Student_ID and 
        xs:date(Admission_Date) < current-date() + xs:dayTimeDuration("P30D") 
      ]
return 
  ($student/Student_ID, $student/Student_Name)

В спецификации XQuery есть примеры «внутренних» и «внешних» объединений , которые могут быть информативными.

...