How Get distinct value node XML

笑着哭i 提交于 2019-12-06 04:07:34

问题


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:

  1. all courses
  2. 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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!