如何从书籍列表中将数据XML转换为表格

时间:2017-08-16 10:48:06

标签: xml xslt xpath

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

这是书籍的数据。我无法改变格式。我不知道如何与读者合作阅读。无论我做什么,它似乎都无法发挥作用。

这是我的xsl表

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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"/>
        </table>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="readerList">
    <tr>
    <td><xsl:value-of select="readers/@sid"/></td>
     <td><xsl:value-of select="readers"/></td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

我希望它显然符合我指定的格式,但无论我做什么,我都无法让它工作。

1 个答案:

答案 0 :(得分:1)

您遇到的一个问题是您的XML已readerList,但您的XSLT已readersList。此外,您只有一个readerList但看起来您希望模板中的代码与每个reader输出一次,因此您可能希望选择reader元素。< / p>

试试这个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可能会更麻烦,并且可能需要一个新问题......