Зацикливание данных в xslt 3.0 потоковой передачей

У меня есть входной файл xml под названием «предложения», и у меня есть XML-курс, оба находятся в комбинированном xml, и файл должен иметь все заголовки, которые есть в xml-курсе. В этом случае количество заголовков, представленных в предложениях xml, равно 3, т.е.

  • Ссылка на класс запуска — HDU_VILT01 — 1
  • Ссылка на класс запуска — HDU_VILT01 — 3
  • Ссылка на класс запуска — HDU_VILT01 — 5

но в Course xml есть 6 заголовков Instructor_Led_Webinar_Lesson_Data Поэтому мне нужно зациклиться и показать подтверждение того, что соответствующий урок не найден. кто-нибудь может помочь в зацикливании в потоковом режиме.

Обновлен исходный xml

<?xml version='1.0' encoding='utf-8'?>
<FileAndCourses>
    <Maps>
        <Locations>
            <Location>
                <InternalValue>7070</InternalValue>
                <ExternalValue>Laval</ExternalValue>
            </Location>
            <Location>
                <InternalValue>7000</InternalValue>
                <ExternalValue>TORSSC</ExternalValue>
            </Location>
        </Locations>
            <Rooms>
                <Room>
                    <InternalValue>LOCATION-6-3881</InternalValue>
                    <ExternalValue>Ottawa District Training Center</ExternalValue>
                </Room>
            </Rooms>  
            
    </Maps>
    <Instructors>
        <Instructor>
        <InstructorID>119417764</InstructorID>
        <WorkdayUserName>AXH4006</WorkdayUserName>
    </Instructor>
    </Instructors>
      <AllCourses
        xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
        xmlns:env = "http://schemas.xmlsoap.org/soap/envelope/"
        xmlns:wd = "urn:com.workday/bsvc">
                <wd:Learning_Course>
            <wd:Learning_Blended_Course_Reference>
                <wd:ID wd:type = "WID">88388986cbbf10128d2b24f4f5c40000</wd:ID>
                <wd:ID wd:type = "Learning_Course_ID">00151744</wd:ID>
                <wd:ID wd:type = "Learning_Course">Designing Kitchens Part II</wd:ID>
            </wd:Learning_Blended_Course_Reference>
            <wd:Learning_Course_Data>
                <wd:ID>00151744</wd:ID>
                <wd:Effective_Date>2014-10-04</wd:Effective_Date>
                <wd:Inactive>0</wd:Inactive>
                <wd:Course_Title>Designing Kitchens Part II</wd:Course_Title>
                <wd:Description>Designing Kitchens Part II</wd:Description>
                <wd:Course_Number>00151744</wd:Course_Number>
                <wd:Topic_Reference>
                    <wd:ID wd:type = "WID">9d1f49654c8310154e239c7090fc0000</wd:ID>
                    <wd:ID wd:type = "Learning_Topic">Product Knowledge - US</wd:ID>
                </wd:Topic_Reference>
                <wd:Language_Reference>
                    <wd:ID wd:type = "WID">da594226446c11de98360015c5e6daf6</wd:ID>
                    <wd:ID wd:type = "User_Language_ID">en_US</wd:ID>
                </wd:Language_Reference>
                <wd:Minimum_Enrollment_Capacity>0</wd:Minimum_Enrollment_Capacity>
                <wd:Maximum_Enrollment_Capacity>0</wd:Maximum_Enrollment_Capacity>
                <wd:Waitlist_Capacity>0</wd:Waitlist_Capacity>
                <wd:Unlimited_Capacity>1</wd:Unlimited_Capacity>
                <wd:Learning_Pricing_Data>
                    <wd:Pricing_Enabled>0</wd:Pricing_Enabled>
                    <wd:Price_in_Training_Credits>0</wd:Price_in_Training_Credits>
                </wd:Learning_Pricing_Data>
                <wd:Time_Value_Reference>
                    <wd:ID wd:type = "WID">f31be4fd5caa10001d7c625e27014929</wd:ID>
                    <wd:ID wd:type = "Learning_Time_Unit_ID">HOURS</wd:ID>
                </wd:Time_Value_Reference>
                <wd:Total_Course_Duration>18</wd:Total_Course_Duration>
                <wd:Enable_Auto_Enrollment_from_Waitlist>0</wd:Enable_Auto_Enrollment_from_Waitlist>
                <wd:Legacy_Course>1</wd:Legacy_Course>
                <wd:Allowed_Instructor_Reference>
                    <wd:ID wd:type = "WID">88388986cbbf10124df56ab318140000</wd:ID>
                    <wd:ID wd:type = "Learning_Instructor_ID">100735117</wd:ID>
                </wd:Allowed_Instructor_Reference>
                <wd:Allowed_Instructor_Reference>
                    <wd:ID wd:type = "WID">b7f5fd27bc071018bbed7a460ce30000</wd:ID>
                    <wd:ID wd:type = "Learning_Instructor_ID">119417764</wd:ID>
                </wd:Allowed_Instructor_Reference>
                <wd:Allowed_Instructor_Reference>
                    <wd:ID wd:type = "WID">88388986cbbf10124df57b8e81f30002</wd:ID>
                    <wd:ID wd:type = "Learning_Instructor_ID">104034590</wd:ID>
                </wd:Allowed_Instructor_Reference>
                <wd:All_Locations>0</wd:All_Locations>
                <wd:Exclude_from_Recommendations>1</wd:Exclude_from_Recommendations>
                <wd:Exclude_from_Search_and_Browse>0</wd:Exclude_from_Search_and_Browse>
                <wd:Disable_Express_Interest>1</wd:Disable_Express_Interest>
                <wd:Course_Lesson_Data>
                    <wd:Lesson_Order>1</wd:Lesson_Order>
                    <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                    <wd:Instructor_Led_Webinar_Lesson_Data>
                        <wd:Title>Launch Class Link - HDU_VILT01 - 1</wd:Title>
                        <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                        <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                    </wd:Instructor_Led_Webinar_Lesson_Data>
                </wd:Course_Lesson_Data>
                <wd:Course_Lesson_Data>
                    <wd:Lesson_Order>2</wd:Lesson_Order>
                    <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                    <wd:Instructor_Led_Webinar_Lesson_Data>
                        <wd:Title>Launch Class Link - HDU_VILT01 - 2</wd:Title>
                        <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                        <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                    </wd:Instructor_Led_Webinar_Lesson_Data>
                </wd:Course_Lesson_Data>
                <wd:Course_Lesson_Data>
                    <wd:Lesson_Order>3</wd:Lesson_Order>
                    <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                    <wd:Instructor_Led_Webinar_Lesson_Data>
                        <wd:Title>Launch Class Link - HDU_VILT01 - 3</wd:Title>
                        <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                        <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                    </wd:Instructor_Led_Webinar_Lesson_Data>
                </wd:Course_Lesson_Data>
                <wd:Course_Lesson_Data>
                    <wd:Lesson_Order>4</wd:Lesson_Order>
                    <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                    <wd:Instructor_Led_Webinar_Lesson_Data>
                        <wd:Title>Launch Class Link - HDU_VILT01 - 4</wd:Title>
                        <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                        <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                    </wd:Instructor_Led_Webinar_Lesson_Data>
                </wd:Course_Lesson_Data>
                <wd:Course_Lesson_Data>
                    <wd:Lesson_Order>5</wd:Lesson_Order>
                    <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                    <wd:Instructor_Led_Webinar_Lesson_Data>
                        <wd:Title>Launch Class Link - HDU_VILT01 - 5</wd:Title>
                        <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                        <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                    </wd:Instructor_Led_Webinar_Lesson_Data>
                </wd:Course_Lesson_Data>
                <wd:Course_Lesson_Data>
                    <wd:Lesson_Order>6</wd:Lesson_Order>
                    <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                    <wd:Instructor_Led_Webinar_Lesson_Data>
                        <wd:Title>Launch Class Link - HDU_VILT01 - 6</wd:Title>
                        <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                        <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                    </wd:Instructor_Led_Webinar_Lesson_Data>
                </wd:Course_Lesson_Data>
                <wd:Course_Lesson_Data>
                    <wd:Lesson_Order>7</wd:Lesson_Order>
                    <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                    <wd:Media_Lesson_Data>
                        <wd:Media_Reference>
                            <wd:ID wd:type = "WID">88388986cbbf10128d2b23247d3f0004</wd:ID>
                            <wd:ID wd:type = "Media_ID">MEDIA-6-4195</wd:ID>
                            <wd:ID wd:type = "Workdrive_Item_ID">MEDIA-6-4195</wd:ID>
                        </wd:Media_Reference>
                        <wd:Learning_Course_Lesson_Title>Welcome to HDU Distance Learning</wd:Learning_Course_Lesson_Title>
                        <wd:Provide_Course_Grade>0</wd:Provide_Course_Grade>
                    </wd:Media_Lesson_Data>
                </wd:Course_Lesson_Data>
                <wd:Course_Lesson_Data>
                    <wd:Lesson_Order>8</wd:Lesson_Order>
                    <wd:Make_Lesson_Mandatory>0</wd:Make_Lesson_Mandatory>
                    <wd:Media_Lesson_Data>
                        <wd:Media_Reference>
                            <wd:ID wd:type = "WID">358e28e73d5d10109aef5b042fc20000</wd:ID>
                            <wd:ID wd:type = "Media_ID">cninv000000000020562.zip</wd:ID>
                            <wd:ID wd:type = "Workdrive_Item_ID">cninv000000000020562.zip</wd:ID>
                        </wd:Media_Reference>
                        <wd:Learning_Course_Lesson_Title>Course Feedback HDUv3</wd:Learning_Course_Lesson_Title>
                        <wd:Provide_Course_Grade>0</wd:Provide_Course_Grade>
                    </wd:Media_Lesson_Data>
                </wd:Course_Lesson_Data>
            </wd:Learning_Course_Data>
        </wd:Learning_Course>
          <wd:Learning_Course>
              <wd:Learning_Blended_Course_Reference>
                  <wd:ID wd:type = "WID">88388986cbbf10128d2c78dc802e0001</wd:ID>
                  <wd:ID wd:type = "Learning_Course_ID">00170024CA</wd:ID>
                  <wd:ID wd:type = "Learning_Course">Design Basics (Designer Training 4) - Virtual ILT</wd:ID>
              </wd:Learning_Blended_Course_Reference>
              <wd:Learning_Course_Data>
                  <wd:ID>00170024CA</wd:ID>
                  <wd:Effective_Date>2019-02-26</wd:Effective_Date>
                  <wd:Inactive>0</wd:Inactive>
                  <wd:Course_Title>Design Basics (Designer Training 4) - Virtual ILT</wd:Course_Title>
                  <wd:Description>&lt;p>In this 5 module virtual course the designer will learn the basics of drafting and laying out basic designs for Contractors and DIY customers.&lt;/p></wd:Description>
                  <wd:Course_Number>00170024CA</wd:Course_Number>
                  <wd:Topic_Reference>
                      <wd:ID wd:type = "WID">9d1f49654c8310154e4430e071ef0000</wd:ID>
                      <wd:ID wd:type = "Learning_Topic">Customer Service and Selling Skills - CAN</wd:ID>
                  </wd:Topic_Reference>
                  <wd:Language_Reference>
                      <wd:ID wd:type = "WID">da5948c0446c11de98360015c5e6daf6</wd:ID>
                      <wd:ID wd:type = "User_Language_ID">en_CA</wd:ID>
                  </wd:Language_Reference>
                  <wd:Minimum_Enrollment_Capacity>4</wd:Minimum_Enrollment_Capacity>
                  <wd:Maximum_Enrollment_Capacity>10</wd:Maximum_Enrollment_Capacity>
                  <wd:Waitlist_Capacity>0</wd:Waitlist_Capacity>
                  <wd:Unlimited_Capacity>0</wd:Unlimited_Capacity>
                  <wd:Learning_Pricing_Data>
                      <wd:Pricing_Enabled>0</wd:Pricing_Enabled>
                      <wd:Price_in_Training_Credits>0</wd:Price_in_Training_Credits>
                  </wd:Learning_Pricing_Data>
                  <wd:Time_Value_Reference>
                      <wd:ID wd:type = "WID">f31be4fd5caa10001d7c6231be3b4927</wd:ID>
                      <wd:ID wd:type = "Learning_Time_Unit_ID">MINUTES</wd:ID>
                  </wd:Time_Value_Reference>
                  <wd:Total_Course_Duration>900</wd:Total_Course_Duration>
                  <wd:Enable_Auto_Enrollment_from_Waitlist>0</wd:Enable_Auto_Enrollment_from_Waitlist>
                  <wd:Legacy_Course>1</wd:Legacy_Course>
                  <wd:Allowed_Instructor_Reference>
                      <wd:ID wd:type = "WID">88388986cbbf10124df5cfa198ca0000</wd:ID>
                      <wd:ID wd:type = "Learning_Instructor_ID">718700459</wd:ID>
                  </wd:Allowed_Instructor_Reference>
                  <wd:Allowed_Instructor_Reference>
                      <wd:ID wd:type = "WID">88388986cbbf10124df5c99611170000</wd:ID>
                      <wd:ID wd:type = "Learning_Instructor_ID">713400041</wd:ID>
                  </wd:Allowed_Instructor_Reference>
                  <wd:Allowed_Instructor_Reference>
                      <wd:ID wd:type = "WID">88388986cbbf10124df5c72adbc60000</wd:ID>
                      <wd:ID wd:type = "Learning_Instructor_ID">702300581</wd:ID>
                  </wd:Allowed_Instructor_Reference>
                  <wd:All_Locations>0</wd:All_Locations>
                  <wd:Exclude_from_Recommendations>1</wd:Exclude_from_Recommendations>
                  <wd:Exclude_from_Search_and_Browse>0</wd:Exclude_from_Search_and_Browse>
                  <wd:Disable_Express_Interest>1</wd:Disable_Express_Interest>
                  <wd:Course_Lesson_Data>
                      <wd:Lesson_Order>1</wd:Lesson_Order>
                      <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                      <wd:Instructor_Led_Webinar_Lesson_Data>
                          <wd:Title>Session 1</wd:Title>
                          <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                          <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                      </wd:Instructor_Led_Webinar_Lesson_Data>
                  </wd:Course_Lesson_Data>
                  <wd:Course_Lesson_Data>
                      <wd:Lesson_Order>2</wd:Lesson_Order>
                      <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                      <wd:Instructor_Led_Webinar_Lesson_Data>
                          <wd:Title>Session 2</wd:Title>
                          <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                          <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                      </wd:Instructor_Led_Webinar_Lesson_Data>
                  </wd:Course_Lesson_Data>
                  <wd:Course_Lesson_Data>
                      <wd:Lesson_Order>3</wd:Lesson_Order>
                      <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                      <wd:Instructor_Led_Webinar_Lesson_Data>
                          <wd:Title>Session 3</wd:Title>
                          <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                          <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                      </wd:Instructor_Led_Webinar_Lesson_Data>
                  </wd:Course_Lesson_Data>
                  <wd:Course_Lesson_Data>
                      <wd:Lesson_Order>4</wd:Lesson_Order>
                      <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                      <wd:Instructor_Led_Webinar_Lesson_Data>
                          <wd:Title>Session 4</wd:Title>
                          <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                          <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                      </wd:Instructor_Led_Webinar_Lesson_Data>
                  </wd:Course_Lesson_Data>
                  <wd:Course_Lesson_Data>
                      <wd:Lesson_Order>5</wd:Lesson_Order>
                      <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                      <wd:Instructor_Led_Webinar_Lesson_Data>
                          <wd:Title>Session 5</wd:Title>
                          <wd:Webinar_Lesson_Unit_Track_Attendance>1</wd:Webinar_Lesson_Unit_Track_Attendance>
                          <wd:Webinar_Lesson_Unit_Track_Grades>0</wd:Webinar_Lesson_Unit_Track_Grades>
                      </wd:Instructor_Led_Webinar_Lesson_Data>
                  </wd:Course_Lesson_Data>
                  <wd:Course_Lesson_Data>
                      <wd:Lesson_Order>6</wd:Lesson_Order>
                      <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>
                      <wd:Media_Lesson_Data>
                          <wd:Media_Reference>
                              <wd:ID wd:type = "WID">88388986cbbf10128d2c770c4c2b0003</wd:ID>
                              <wd:ID wd:type = "Media_ID">MEDIA-6-4222</wd:ID>
                              <wd:ID wd:type = "Workdrive_Item_ID">MEDIA-6-4222</wd:ID>
                          </wd:Media_Reference>
                          <wd:Learning_Course_Lesson_Title>Log in Instructions (Adobe Connect - Designer 4_DesignBasics) (updated May 2022)</wd:Learning_Course_Lesson_Title>
                          <wd:Provide_Course_Grade>0</wd:Provide_Course_Grade>
                      </wd:Media_Lesson_Data>
                  </wd:Course_Lesson_Data>
                  <wd:Course_Lesson_Data>
                      <wd:Lesson_Order>7</wd:Lesson_Order>
                      <wd:Make_Lesson_Mandatory>0</wd:Make_Lesson_Mandatory>
                      <wd:Media_Lesson_Data>
                          <wd:Media_Reference>
                              <wd:ID wd:type = "WID">358e28e73d5d1010910342e9c79a0000</wd:ID>
                              <wd:ID wd:type = "Media_ID">cninv000000000019226.zip</wd:ID>
                              <wd:ID wd:type = "Workdrive_Item_ID">cninv000000000019226.zip</wd:ID>
                          </wd:Media_Reference>
                          <wd:Learning_Course_Lesson_Title>Course Evaluation - vILT (L1)</wd:Learning_Course_Lesson_Title>
                          <wd:Provide_Course_Grade>0</wd:Provide_Course_Grade>
                      </wd:Media_Lesson_Data>
                  </wd:Course_Lesson_Data>
              </wd:Learning_Course_Data>
          </wd:Learning_Course>
                    </AllCourses>
       <Offerings>
        <Offering>
            <Lesson>
                <Offering-ID>C2212001 DL 3Wks Mon 4pm-7pm EASTERN</Offering-ID>
                <Course-Number>00151744</Course-Number>
                <Min-Seats>10</Min-Seats>
                <Max-Seats>20</Max-Seats>
                <Webinar>Y</Webinar>
                <Title>Launch Class Link - HDU_VILT01 - 1</Title>
                <Start-Date>11/28/2022</Start-Date>
                <Start-Time>04:00PM</Start-Time>
                <End-Date>11/28/2022</End-Date>
                <End-Time>07:00PM</End-Time>
                <Facilitator-LDAP>AXH4006</Facilitator-LDAP>
                <Location/>
                <Room/>
                <Language>en_US</Language>
                <Webinar-URL>https://hdu.adobeconnect.com</Webinar-URL>
            </Lesson>
            <Lesson>
                <Offering-ID>C2212001 DL 3Wks Mon 4pm-7pm EASTERN</Offering-ID>
                <Course-Number>00151744</Course-Number>
                <Min-Seats>10</Min-Seats>
                <Max-Seats>20</Max-Seats>
                <Webinar>Y</Webinar>
                <Title>Launch Class Link - HDU_VILT01 - 3</Title>
                <Start-Date>12/05/2022</Start-Date>
                <Start-Time>04:00PM</Start-Time>
                <End-Date>12/05/2022</End-Date>
                <End-Time>07:00PM</End-Time>
                <Facilitator-LDAP>AXH4006</Facilitator-LDAP>
                <Location/>
                <Room/>
                <Language>en_US</Language>
                <Webinar-URL>https://hdu.adobeconnect.com</Webinar-URL>
            </Lesson>
            <Lesson>
                <Offering-ID>C2212001 DL 3Wks Mon 4pm-7pm EASTERN</Offering-ID>
                <Course-Number>00151744</Course-Number>
                <Min-Seats>10</Min-Seats>
                <Max-Seats>20</Max-Seats>
                <Webinar>Y</Webinar>
                <Title>Launch Class Link - HDU_VILT01 - 5</Title>
                <Start-Date>12/12/2022</Start-Date>
                <Start-Time>04:00PM</Start-Time>
                <End-Date>12/12/2022</End-Date>
                <End-Time>07:00PM</End-Time>
                <Facilitator-LDAP>AXH4006</Facilitator-LDAP>
                <Location/>
                <Room/>
                <Language>en_US</Language>
                <Webinar-URL>https://hdu.adobeconnect.com</Webinar-URL>
            </Lesson>
        </Offering>
         
            </Offerings>
</FileAndCourses>

Ожидаемый результат

<?xml version = "1.0" encoding = "UTF-8"?>
<OfferingsWithCourse>
    <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 2</Error>
   <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 4</Error>
   <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 6</Error>
</OfferingsWithCourse>

но получить этот вывод

<?xml version = "1.0" encoding = "UTF-8"?>
<OfferingsWithCourse>
   <Error>No offering for 00170024CA title Session 1</Error>
   <Error>No offering for 00170024CA title Session 2</Error>
   <Error>No offering for 00170024CA title Session 3</Error>
   <Error>No offering for 00170024CA title Session 4</Error>
   <Error>No offering for 00170024CA title Session 5</Error>
   <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 2</Error>
   <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 4</Error>
   <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 6</Error>
</OfferingsWithCourse>

Я хочу проверить только входной файл с номером курса 00151744, а не курсы по исходным данным, не могли бы вы мне помочь?

Выводит ли опубликованный XSLT хотя бы нужный вам результат, не полагаясь на потоковую передачу? Или какой результат вы ищете? Ваш опубликованный образец ввода, похоже, имеет один элемент wd:Learning_Course, поэтому, когда вы это делаете, например. fold-left(wd:Learning_Course/copy-of() непонятно, какой именно сбор данных вы хотите произвести.

Martin Honnen 04.11.2022 23:07

И какую проверку вы хотите выполнить для подтверждения того, что любой Title в Offerings/Offering/Lesson соответствует wd:Title в wd:Course_Lesson_Data? Похоже, это относится к предоставленным образцам данных. Или вам нужно проверить, что у любого wd:Title в wd:Course_Lesson_Data есть совпадение Lesson с этим Title?

Martin Honnen 04.11.2022 23:45

Опубликованный код дает ошибки о переменной LearningCourseMap в двух местах, где вы опечатались или скопировали имена переменных LearningCoursesMap. После исправления это for-each над логическим значением не имеет никакого смысла.

Martin Honnen 05.11.2022 22:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если задача состоит в том, чтобы найти для любого Offerings/Offering/Lesson/Title соответствие wd:LearningCourse на основе Course-Number/wd:ID, а затем сравнить Title и wd:Course_Lesson_Datawd:Title, то вот подход с использованием потоковой передачи:

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
    xmlns:xs = "http://www.w3.org/2001/XMLSchema"
    xmlns:map = "http://www.w3.org/2005/xpath-functions/map"
    xmlns:wd = "urn:com.workday/bsvc"
    exclude-result-prefixes = "#all"
    version = "3.0">
  
  <xsl:accumulator name = "learning-course-id" as = "xs:string?" initial-value = "()" streamable = "yes">
    <xsl:accumulator-rule match = "AllCourses/wd:Learning_Course/wd:Learning_Course_Data/wd:ID/text()" select = "string()"/>
  </xsl:accumulator>
  
  <xsl:accumulator name = "webinars" as = "map(xs:string, xs:string*)" initial-value = "map{}" streamable = "yes">
    <xsl:accumulator-rule match = "AllCourses/wd:Learning_Course/wd:Learning_Course_Data/wd:Course_Lesson_Data/wd:Instructor_Led_Webinar_Lesson_Data/wd:Title/text()" 
      select = "let $id := accumulator-before('learning-course-id')
              return
                if (map:contains($value, $id))
                then map:put($value, $id, ($value($id), string()))
                else map:put($value, $id, string())"/>
  </xsl:accumulator>
  
  <xsl:accumulator name = "classroom-lessons" as = "map(xs:string, xs:string*)" initial-value = "map{}" streamable = "yes">
    <xsl:accumulator-rule match = "AllCourses/wd:Learning_Course/wd:Learning_Course_Data/wd:Course_Lesson_Data/wd:Instructor_Led_Lesson_Data/wd:Title/text()" 
      select = "let $id := accumulator-before('learning-course-id')
              return
                if (map:contains($value, $id))
                then map:put($value, $id, ($value($id), string()))
                else map:put($value, $id, string())"/>
  </xsl:accumulator>

  <xsl:mode on-no-match = "shallow-skip" use-accumulators = "#all" streamable = "yes"/>

  <xsl:output method = "xml" indent = "yes"/>

  <xsl:template match = "/FileAndCourses">
    <OfferingsWithCourse>
      <xsl:apply-templates select = "Offerings/Offering"/>
    </OfferingsWithCourse>
  </xsl:template>
  
  <xsl:template match = "Offering/Lesson">
    <xsl:apply-templates select = "copy-of()" mode = "grounded"/>
  </xsl:template>
  
  <xsl:mode name = "grounded" on-no-match = "shallow-copy"/>
  
  <xsl:template mode = "grounded" match = "Lesson[Webinar = 'Y'][let $webinars := accumulator-before('webinars') return if (map:contains($webinars, Course-Number)) then not(Title = $webinars(Course-Number)) else false()]">
    <xsl:copy>
      <xsl:copy-of select = "*"/>
      <Error>
          <xsl:text>No intructor-led webinar lesson found in course with title: </xsl:text>
          <xsl:value-of select = "Title"/>
          <xsl:text>. </xsl:text>
      </Error>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template mode = "grounded" match = "Lesson[Webinar = 'N'][let $lessons := accumulator-before('classroom-lessons') return if (map:contains($lessons, Course-Number)) then not(Title = $lessons(Course-Number)) else false()]">
    <xsl:copy>
      <xsl:copy-of select = "*"/>
        <Error>
            <xsl:text>No intructor-led classrom lesson found in course with title: </xsl:text>
            <xsl:value-of select = "Title"/>
            <xsl:text>. </xsl:text>
        </Error>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template mode = "grounded" match = "Lesson[Webinar = 'Y'][not(map:contains(accumulator-before('webinars'), Course-Number))] | Lesson[Webinar = 'N'][not(map:contains(accumulator-before('classroom-lessons'), Course-Number))]">
    <xsl:copy>
      <xsl:copy-of select = "*"/>
        <Error>
            <xsl:text>Unable to find active course </xsl:text>
            <xsl:value-of select = "Course-Number"/>
            <xsl:text> in Workday. </xsl:text>
        </Error>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

Наоборот, проверить, есть ли предложения для данного wd:Course_Lesson_Data, было бы

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
    xmlns:xs = "http://www.w3.org/2001/XMLSchema"
    xmlns:map = "http://www.w3.org/2005/xpath-functions/map"
    xmlns:wd = "urn:com.workday/bsvc"
    exclude-result-prefixes = "#all"
    version = "3.0">
  
  <xsl:accumulator name = "learning-course-id" as = "xs:string?" initial-value = "()" streamable = "yes">
    <xsl:accumulator-rule match = "AllCourses/wd:Learning_Course/wd:Learning_Course_Data/wd:ID/text()" select = "string()"/>
  </xsl:accumulator>

  <xsl:accumulator name = "lesson-mandatory" as = "xs:boolean?" initial-value = "()" streamable = "yes">
    <xsl:accumulator-rule match = "AllCourses/wd:Learning_Course/wd:Learning_Course_Data/wd:Course_Lesson_Data" select = "false()"/>
    <xsl:accumulator-rule match = "AllCourses/wd:Learning_Course/wd:Learning_Course_Data/wd:Course_Lesson_Data/wd:Make_Lesson_Mandatory/text()" select = ". = 1"/>
  </xsl:accumulator>
  
  <xsl:accumulator name = "webinars" as = "map(xs:string, xs:string*)" initial-value = "map{}" streamable = "yes">
    <xsl:accumulator-rule match = "AllCourses/wd:Learning_Course/wd:Learning_Course_Data/wd:Course_Lesson_Data/wd:Instructor_Led_Webinar_Lesson_Data[accumulator-before('lesson-mandatory')]/wd:Title/text()" 
      select = "let $id := accumulator-before('learning-course-id')
              return
                if (map:contains($value, $id))
                then map:put($value, $id, ($value($id), string()))
                else map:put($value, $id, string())"/>
  </xsl:accumulator>
  
  <xsl:accumulator name = "classroom-lessons" as = "map(xs:string, xs:string*)" initial-value = "map{}" streamable = "yes">
    <xsl:accumulator-rule match = "AllCourses/wd:Learning_Course/wd:Learning_Course_Data/wd:Course_Lesson_Data/wd:Instructor_Led_Lesson_Data[accumulator-before('lesson-mandatory')]/wd:Title/text()" 
      select = "let $id := accumulator-before('learning-course-id')
              return
                if (map:contains($value, $id))
                then map:put($value, $id, ($value($id), string()))
                else map:put($value, $id, string())"/>
  </xsl:accumulator>

  <xsl:accumulator name = "offered-lesson-id" as = "xs:string?" initial-value = "()" streamable = "yes">
    <xsl:accumulator-rule match = "Offerings/Offering/Lesson/Course-Number/text()" select = "string()"/>
  </xsl:accumulator>

  <xsl:accumulator name = "offered-lessons" as = "map(xs:string, xs:string*)" initial-value = "map{}" streamable = "yes">
    <xsl:accumulator-rule match = "Offerings/Offering/Lesson/Title/text()" 
      select = "let $id := accumulator-before('offered-lesson-id')
              return
                if (map:contains($value, $id))
                then map:put($value, $id, ($value($id), string()))
                else map:put($value, $id, string())"/>
  </xsl:accumulator>

  <xsl:mode on-no-match = "shallow-skip" use-accumulators = "#all" streamable = "yes"/>

  <xsl:output method = "xml" indent = "yes"/>

  <xsl:template match = "/FileAndCourses" expand-text = "yes">
    <OfferingsWithCourse>
      <xsl:apply-templates/>
      <xsl:variable name = "webinars" select = "accumulator-after('webinars')"/>
      <xsl:variable name = "offered-lessons" select = "accumulator-after('offered-lessons')"/>
      <xsl:for-each select = "map:keys(accumulator-after('webinars'))">
        <xsl:variable name = "webinar-id" select = "."/>
        <xsl:for-each select = "$webinars(.)[not(. = $offered-lessons($webinar-id))]">
          <Error>No offering for {$webinar-id} title {.}</Error>
        </xsl:for-each>
      </xsl:for-each>
    </OfferingsWithCourse>
  </xsl:template>
  
</xsl:stylesheet>

Для ваших выборочных данных это выводит

<?xml version = "1.0" encoding = "UTF-8"?>
<OfferingsWithCourse>
   <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 2</Error>
   <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 4</Error>
   <Error>No offering for 00151744 title Launch Class Link - HDU_VILT01 - 6</Error>
</OfferingsWithCourse>

Для вашего последнего редактирования с образцом ввода/вывода желаемый вывод достигается путем изменения последнего шаблона (во втором XSLT выше) на

  <xsl:template match = "/FileAndCourses" expand-text = "yes">
    <OfferingsWithCourse>
      <xsl:apply-templates/>
      <xsl:variable name = "webinars" select = "accumulator-after('webinars')"/>
      <xsl:variable name = "offered-lessons" select = "accumulator-after('offered-lessons')"/>
      <xsl:for-each select = "map:keys(accumulator-after('webinars'))[. = map:keys($offered-lessons)]">
        <xsl:variable name = "webinar-id" select = "."/>
        <xsl:for-each select = "$webinars(.)[not(. = $offered-lessons($webinar-id))]">
          <Error>No offering for {$webinar-id} title {.}</Error>
        </xsl:for-each>
      </xsl:for-each>
    </OfferingsWithCourse>
  </xsl:template>

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

Chris Tucker 2016 05.11.2022 04:56

Заголовок в предложениях/предложениях/уроках соответствует wd:Title в wd:Course_Lesson_Data, который является обязательными данными урока курса <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>, а также совпадает количество. В этом примере количество не равно соответствие, поэтому следует разместить проверку. можешь помочь мне с этим

Chris Tucker 2016 05.11.2022 05:03

Можете ли вы помочь мне с этой проверкой в ​​моем xslt, это будет полезно.

Chris Tucker 2016 05.11.2022 05:06

@ChrisTucker2016, рассмотрите возможность отредактировать свой вопрос и показать желаемый результат для опубликованного входного образца. Я не вижу ни в вашем коде, ни в вашем тексте попытки использовать Make_Lesson_Mandatory, и, похоже, там нет поля «количество». Если «подсчет» означает использование функции XPath count, вам нужно объяснить, какие элементы вы хотите/должны подсчитывать и как это должно вписываться в потоковую передачу. У вас есть непотоковое решение, которое работает с небольшим набором данных, но не работает с вашим полным набором данных из-за ограничений памяти?

Martin Honnen 05.11.2022 07:43

@ChrisTucker2016, я отредактировал ответ, чтобы предоставить второй потоковый образец, который выводит wd:Course_Lesson_Data, для которого нет соответствия Offering/Lesson.

Martin Honnen 05.11.2022 11:37

Если курс во входном файле не соответствует курсу в данных урока курса, мы помещаем приведенный ниже синтаксис, но возникает проблема с синтаксисом.

Chris Tucker 2016 05.11.2022 19:19

@ChrisTucker2016, подумайте над тем, чтобы отредактировать свой вопрос и показать точный результат, который вы хотите получить с помощью потоковой передачи XSLT для опубликованного вами входного образца.

Martin Honnen 05.11.2022 19:28

Я отредактировал свой xslt, который я пытался. Не соответствует требуемому уроку, есть некоторые проблемы с синтаксисом, поэтому, если во входном файле нет предложения/урока/названия или отсутствует заголовок из wd:Course_Lesson_Data, тогда должна быть показана проверка.

Chris Tucker 2016 05.11.2022 19:30

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

Martin Honnen 05.11.2022 19:37

Привет, Мартин, мне нужна та же проверка, что и во втором xslt. Если вы проверите мой код, я получаю некоторые синтаксические ошибки. Пожалуйста, помогите мне с той же проверкой в ​​моем коде

Chris Tucker 2016 05.11.2022 19:52

Во втором xslt в исходнике 100 id курса, а в файле только 5 id курса. Он должен проверять только 5, но это проверка для всех 100 курсов. можешь помочь мне с этим

Chris Tucker 2016 06.11.2022 10:20

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

Martin Honnen 06.11.2022 11:09

Привет, Мартин, я обновил исходный код xml, не могли бы вы мне помочь?

Chris Tucker 2016 06.11.2022 12:01

@ChrisTucker2016, я пытаюсь понять, чего вы хотите достичь, и пытаюсь помочь вам в этом. Является ли это требование о 00151744 (например, «Я хочу проверить только номер курса входного файла 00151744») чем-то, что должно быть выведено из входного образца, или вы могли бы / хотели бы передать это конкретное Course-Number в качестве параметра в таблицу стилей?

Martin Honnen 06.11.2022 12:28

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

Chris Tucker 2016 06.11.2022 13:08

@ChrisTucker2016, не торопитесь, чтобы попытаться адаптировать ответ, для которого вы сказали «Это работает», к вашим полным и окончательным потребностям или различным требованиям, которые у вас могут быть; если вы обнаружите, что застряли, пытаясь реализовать одно конкретное требование, задайте новый вопрос с необходимыми деталями (минимальные, но полные и репрезентативные образцы XML, XSLT, желаемый результат, вывод или ошибка, которые вы получаете, объяснение того, чего вы хотите достичь и как это не удается).

Martin Honnen 06.11.2022 13:46

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

Другие вопросы по теме