2012-11-12 27 views
4

我是XML新手,所以我希望得到您的幫助。 我有以下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> 

我需要知道兩件事情:

  1. 所有課程
  2. 有多少學生每門課程的學習化。
+2

嗨,你用什麼編程語言? – Napsteur

+1

您可以將XML作爲XML代碼發佈(縮進以獲取代碼標籤)。此外,你應該說明你想用什麼來獲取你的數據,我假設XPath是因爲你的標籤。如果是這樣,請說明。另外,你到現在爲止嘗試過什麼? –

回答

3

的XPath 1.0
鮮明的課程:

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

我需要知道兩件事情:1。所有 課程

使用

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

2.And有多少學生在每門課程的學習化。

對於給定的過程中使用

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> 

兩個XPath表達式求值反覆(第二供每個課程),並將這些評估的結果複製到輸出

<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