How to get great node XML value

I am new to XML, so I hope for your help. I have the following XML:

<?xml version="1.0" encoding="UTF-8"?> <Students> -<Student Id="001"> <Name>Peter</Name> <LastName>Kohen</LastName> -<Courses> -<Course Id="01"> <Name>C#</Name> </Course> -<Course Id="02"> <Name>Java</Name> </Course> </Courses> </Student> -<Student Id="002"> <Name>Nick</Name> <LastName>Nikes</LastName> -<Courses> -<Course Id="02"> <Name>Java</Name> </Course> -<Course Id="03"> <Name>Oracle</Name> </Course> </Courses> </Student> -<Student Id="003"> <Name>Rafi</Name> <LastName>rafifa</LastName> -<Courses> -<Course Id="02"> <Name>Java</Name> </Course> -<Course Id="03"> <Name>Oracle</Name> </Course> </Courses> </Student> -<Student Id="004"> <Name>Yosi</Name> <LastName>Koen</LastName> -<Courses> -<Course Id="04"> <Name>SQL</Name> </Course> -<Course Id="03"> <Name>Oracle</Name> </Course> </Courses> </Student> </Students> 

I need to know two things:

  • all courses
  • And how many students study in each course.
+4
source share
2 answers

Pure XPath 1.0 :
Separate courses:

 //Course[not(preceding::Course/@Id = @Id)] 
+3
source

I need to know two things: 1.all courses

Using

 /*/*/Courses/Course[not(Name = preceding::Course/Name)] 

2. And how many students study in each course.

For this course, use :

 count(/*/Student[Courses/Course/@Id = $vCourseId]) 

where $vCourseId should be replaced with the actual course identifier.

XSLT Based Validation :

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <xsl:copy-of select= "/*/*/Courses/Course[not(Name = preceding::Course/Name)]"/> =============== <xsl:for-each select= "/*/*/Courses/Course[not(Name = preceding::Course/Name)]"> <xsl:variable name="vCourseId" select="@Id"/> Course Id = <xsl:value-of select="@Id"/>, Students = <xsl:text/> <xsl:value-of select="count(/*/Student[Courses/Course/@Id = $vCourseId])"/> </xsl:for-each> </xsl:template> </xsl:stylesheet> 

When this conversion is applied to the provided XML document:

 <Students> - <Student Id="001"> <Name>Peter</Name> <LastName>Kohen</LastName> - <Courses> - <Course Id="01"> <Name>C#</Name> </Course> - <Course Id="02"> <Name>Java</Name> </Course> </Courses> </Student> - <Student Id="002"> <Name>Nick</Name> <LastName>Nikes</LastName> - <Courses> - <Course Id="02"> <Name>Java</Name> </Course> - <Course Id="03"> <Name>Oracle</Name> </Course> </Courses> </Student> - <Student Id="003"> <Name>Rafi</Name> <LastName>rafifa</LastName> - <Courses> - <Course Id="02"> <Name>Java</Name> </Course> - <Course Id="03"> <Name>Oracle</Name> </Course> </Courses> </Student> - <Student Id="004"> <Name>Yosi</Name> <LastName>Koen</LastName> - <Courses> - <Course Id="04"> <Name>SQL</Name> </Course> - <Course Id="03"> <Name>Oracle</Name> </Course> </Courses> </Student> </Students> 

two XPath expressions are computed (the second time for each course), and the results of these evaluations are copied to the output :

 <Course Id="01"> <Name>C#</Name> </Course> <Course Id="02"> <Name>Java</Name> </Course> <Course Id="03"> <Name>Oracle</Name> </Course> <Course Id="04"> <Name>SQL</Name> </Course> =============== Course Id = 01, Students = 1 Course Id = 02, Students = 3 Course Id = 03, Students = 3 Course Id = 04, Students = 1 
+3
source

Source: https://habr.com/ru/post/1445468/


All Articles