2017-08-16 111 views
0
<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="books.xsl"?> 
<bookList> 
    <Book BookId="3311"> 
     <BookName>Flying</BookName> 
     <readerList> 
      <readers sid="1001">Ashley</readers> 
      <readers sid="1002">Mark</readers> 
      <readers sid="1003">Donar</readers> 
     </readerList> 
     <readingItems> 
      <readings name="Assign 4" weight="20"> 
       <mark studId="1001">15</mark> 
       <mark studId="1002">18</mark> 
       <mark studId="1003">9</mark> 
      </readings> 
      <readings name="Assign 5" weight="25"> 
       <mark studId="1001">23</mark> 
       <mark studId="1002">14</mark> 
       <mark studId="1003">23</mark> 
      </readings> 
      <readings name="Essay" weight="15"> 
       <mark studId="1001">13</mark> 
       <mark studId="1002">12</mark> 
       <mark studId="1003">6</mark> 
      </readings> 
      <readings name="Exam" weight="40"> 
       <mark studId="1001">38</mark> 
       <mark studId="1002">25</mark> 
       <mark studId="1003">20.5</mark> 
      </readings> 
     </readingItems> 
    </Book> 
</bookList> 

這是書籍的數據。我無法更改格式。我不知道如何將readerList與讀者合作。無論我做什麼,它都不起作用。如何從書籍列表中獲取數據XML表格

這是我的XSL片

​​

我想它顯然在我指定的格式,但無論我做什麼,我不能讓它開始工作。

回答

1

您遇到的一個問題是您的XML有readerList,但您的XSLT有readersList。另外,您只有一個readerList,但您希望模板中的代碼與每個reader輸出一次,因此您可能需要選擇reader元素。

試試這個XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <table border="1"> 
      <tr> 
      <th>ID</th> 
      <th>Name</th> 
      <th>Total Mark</th> 
      <th>Grade</th> 
      </tr> 
      <xsl:apply-templates select="bookList/Book/readerList/readers"/> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
    <xsl:template match="readers"> 
    <tr> 
    <td><xsl:value-of select="@sid"/></td> 
    <td><xsl:value-of select="."/></td> 
    <td><xsl:value-of select="sum(../../readingItems/readings/mark[@studId = current()/@sid])"/></td> 
    </tr> 
    </xsl:template> 
</xsl:stylesheet> 

注意我還展示瞭如何獲得積分,雖然這可能與使用xsl:key的改善。

這假設有在你的XML多本圖書,並希望通過本書分離結果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:key name="marksByBook" match="mark" use="concat(../../../@BookId, '|', @studId)" /> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <table border="1"> 
      <tr> 
      <th>ID</th> 
      <th>Name</th> 
      <th>Total Mark</th> 
      <th>Grade</th> 
      </tr> 
      <xsl:apply-templates select="bookList/Book/readerList/readers"/> 
     </table> 
     </body> 
    </html> 
    </xsl:template> 
    <xsl:template match="readers"> 
    <tr> 
    <td><xsl:value-of select="@sid"/></td> 
    <td><xsl:value-of select="."/></td> 
     <td><xsl:value-of select="sum(key('marksByBook', concat(../../@BookId, '|', @sid)))"/></td> 
     <td>?</td> 
    </tr> 
    </xsl:template> 
</xsl:stylesheet> 

考慮到weight可能會更麻煩,並有可能保證一個新的問題...