问题
I am new in XML, so I hope 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 know two things:
- all courses
- And how many students studing in each course.
回答1:
A pure XPath 1.0:
Distinct courses:
//Course[not(preceding::Course/@Id = @Id)]
回答2:
I need know two things: 1.all courses
Use:
/*/*/Courses/Course[not(Name = preceding::Course/Name)]
2.And how many students studing in each course.
For a given course use:
count(/*/Student[Courses/Course/@Id = $vCourseId])
where $vCourseId
must be substituted with the actual course Id.
XSLT - based verification:
<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 transformation is applied on 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>
the two XPath expressions are evaluated (the second repeatedly 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
来源:https://stackoverflow.com/questions/13341305/how-get-distinct-value-node-xml