4

私は XML が初めてなので、助けていただければ幸いです。次の 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>

私は2つのことを知る必要があります:

  1. 全コース
  2. そして、各コースで勉強している学生の数。
4

2 に答える 2

3

純粋なXPath1.0個別
の コース:

//Course[not(preceding::Course/@Id = @Id)]
于 2012-11-12T10:47:05.737 に答える
3

2 つのことを知っておく必要があります: 1.すべてのコース

使用:

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

2.各コースの学生数。

特定のコースの使用について

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

どこ$vCourseIdを実際のコース ID に置き換える必要があります。

XSLT ベースの検証:

<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>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<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>

2 つの XPath 式が評価され (2 回目はコースごとに繰り返し)、これらの評価の結果が出力にコピーされます

<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
于 2012-11-12T13:29:25.457 に答える