У меня есть входной файл xml под названием «предложения», и у меня есть XML-курс, оба находятся в комбинированном xml, и файл должен иметь все заголовки, которые есть в xml-курсе. В этом случае количество заголовков, представленных в предложениях xml, равно 3, т.е.
но в 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><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.</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, а не курсы по исходным данным, не могли бы вы мне помочь?
И какую проверку вы хотите выполнить для подтверждения того, что любой Title
в Offerings/Offering/Lesson
соответствует wd:Title
в wd:Course_Lesson_Data
? Похоже, это относится к предоставленным образцам данных. Или вам нужно проверить, что у любого wd:Title
в wd:Course_Lesson_Data
есть совпадение Lesson
с этим Title
?
Опубликованный код дает ошибки о переменной LearningCourseMap
в двух местах, где вы опечатались или скопировали имена переменных LearningCoursesMap
. После исправления это for-each
над логическим значением не имеет никакого смысла.
Если задача состоит в том, чтобы найти для любого Offerings/Offering/Lesson/Title
соответствие wd:LearningCourse
на основе Course-Number
/wd:ID
, а затем сравнить Title
и wd:Course_Lesson_Data
wd: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>
Спасибо, Мартин, за вашу помощь, но мне нужна дополнительная проверка, которая также будет соответствовать счету.
Заголовок в предложениях/предложениях/уроках соответствует wd:Title в wd:Course_Lesson_Data, который является обязательными данными урока курса <wd:Make_Lesson_Mandatory>1</wd:Make_Lesson_Mandatory>, а также совпадает количество. В этом примере количество не равно соответствие, поэтому следует разместить проверку. можешь помочь мне с этим
Можете ли вы помочь мне с этой проверкой в моем xslt, это будет полезно.
@ChrisTucker2016, рассмотрите возможность отредактировать свой вопрос и показать желаемый результат для опубликованного входного образца. Я не вижу ни в вашем коде, ни в вашем тексте попытки использовать Make_Lesson_Mandatory
, и, похоже, там нет поля «количество». Если «подсчет» означает использование функции XPath count
, вам нужно объяснить, какие элементы вы хотите/должны подсчитывать и как это должно вписываться в потоковую передачу. У вас есть непотоковое решение, которое работает с небольшим набором данных, но не работает с вашим полным набором данных из-за ограничений памяти?
@ChrisTucker2016, я отредактировал ответ, чтобы предоставить второй потоковый образец, который выводит wd:Course_Lesson_Data
, для которого нет соответствия Offering/Lesson
.
Если курс во входном файле не соответствует курсу в данных урока курса, мы помещаем приведенный ниже синтаксис, но возникает проблема с синтаксисом.
@ChrisTucker2016, подумайте над тем, чтобы отредактировать свой вопрос и показать точный результат, который вы хотите получить с помощью потоковой передачи XSLT для опубликованного вами входного образца.
Я отредактировал свой xslt, который я пытался. Не соответствует требуемому уроку, есть некоторые проблемы с синтаксисом, поэтому, если во входном файле нет предложения/урока/названия или отсутствует заголовок из wd:Course_Lesson_Data, тогда должна быть показана проверка.
Удачи с вашим кодом, но изменение кода, чтобы сделать его еще более сложным и запутанным, не сообщая нам, какой результат вы хотите и какую ошибку вы получаете, а также делает ли ваш код то, что вы хотите, без использования потоковой передачи, не поможет.
Привет, Мартин, мне нужна та же проверка, что и во втором xslt. Если вы проверите мой код, я получаю некоторые синтаксические ошибки. Пожалуйста, помогите мне с той же проверкой в моем коде
Во втором xslt в исходнике 100 id курса, а в файле только 5 id курса. Он должен проверять только 5, но это проверка для всех 100 курсов. можешь помочь мне с этим
@ChrisTucker2016, повторяю: подумайте о том, чтобы отредактировать свой вопрос и показать точный результат, который вы хотите получить с помощью потокового XSLT для опубликованного вами входного образца. Еще лучше отредактируйте образец, чтобы сделать его минимальным, но полным и репрезентативным для типа входного образца, а затем также отобразите желаемый полный результат, который вам нужен.
Привет, Мартин, я обновил исходный код xml, не могли бы вы мне помочь?
@ChrisTucker2016, я пытаюсь понять, чего вы хотите достичь, и пытаюсь помочь вам в этом. Является ли это требование о 00151744
(например, «Я хочу проверить только номер курса входного файла 00151744») чем-то, что должно быть выведено из входного образца, или вы могли бы / хотели бы передать это конкретное Course-Number
в качестве параметра в таблицу стилей?
мы можем пройти как номер курса, так и предлагаемые уроки. любая помощь в этом
@ChrisTucker2016, не торопитесь, чтобы попытаться адаптировать ответ, для которого вы сказали «Это работает», к вашим полным и окончательным потребностям или различным требованиям, которые у вас могут быть; если вы обнаружите, что застряли, пытаясь реализовать одно конкретное требование, задайте новый вопрос с необходимыми деталями (минимальные, но полные и репрезентативные образцы XML, XSLT, желаемый результат, вывод или ошибка, которые вы получаете, объяснение того, чего вы хотите достичь и как это не удается).
Простейшим способом сделать это может быть использование потоковой передачи для удаления всех данных, которые не имеют отношения к проблеме, а затем использование обычной таблицы стилей без потоковой передачи для проверки условий соединения.
Выводит ли опубликованный XSLT хотя бы нужный вам результат, не полагаясь на потоковую передачу? Или какой результат вы ищете? Ваш опубликованный образец ввода, похоже, имеет один элемент
wd:Learning_Course
, поэтому, когда вы это делаете, например.fold-left(wd:Learning_Course/copy-of()
непонятно, какой именно сбор данных вы хотите произвести.