用XML生成跨行跨列的表格
已有如下的XML
- XML code
<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="style.xsl"?><Classes> <Class> <grade>2</grade> <type>S</type> <LessonNumbering> <courseNumbering>COMP211</courseNumbering> <classNumbering>21121</classNumbering> </LessonNumbering> <name>数据库设计</name> <teacher>何家忠</teacher> <room>A205</room> <Duration> <start>2010/9/3</start> <end>2010/12/16</end> </Duration> <Time> <day>Monday</day> <start>11:30</start> <end>13:00</end> </Time> </Class> <Class> <grade>2</grade> <type>S</type> <LessonNumbering> <courseNumbering>COMP211</courseNumbering> <classNumbering>21121</classNumbering> </LessonNumbering> <name>数据库设计</name> <teacher>何家忠</teacher> <room>A309</room> <Duration> <start>2010/9/3</start> <end>2010/12/16</end> </Duration> <Time> <day>Tuesday</day> <start>11:30</start> <end>13:00</end> </Time> </Class> <Class> <grade>2</grade> <type>S</type> <LessonNumbering> <courseNumbering>COMP212</courseNumbering> <classNumbering>21121</classNumbering> </LessonNumbering> <name>程序设计II</name> <teacher>柯韦</teacher> <room>A309</room> <Duration> <start>2010/9/3</start> <end>2010/12/16</end> </Duration> <Time> <day>Tuesday</day> <start>14:30</start> <end>17:30</end> </Time> </Class> <Class> <grade>2</grade> <type>S</type> <LessonNumbering> <courseNumbering>COMP213</courseNumbering> <classNumbering>21121</classNumbering> </LessonNumbering> <name>操作系统</name> <teacher>林灿堂</teacher> <room>A309</room> <Duration> <start>2010/9/3</start> <end>2010/12/16</end> </Duration> <Time> <day>Tuesday</day> <start>10:00</start> <end>11:30</end> </Time> </Class> <Class> <grade>2</grade> <type>S</type> <LessonNumbering> <courseNumbering>COMP213</courseNumbering> <classNumbering>21121</classNumbering> </LessonNumbering> <name>操作系统</name> <teacher>林灿堂</teacher> <room>A309</room> <Duration> <start>2010/9/3</start> <end>2010/12/16</end> </Duration> <Time> <day>Thursday</day> <start>11:30</start> <end>13:00</end> </Time> </Class> <Class> <grade>2</grade> <type>S</type> <LessonNumbering> <courseNumbering>COMP214</courseNumbering> <classNumbering>21121</classNumbering> </LessonNumbering> <name>计算机网络</name> <teacher>林灿堂</teacher> <room>A309</room> <Duration> <start>2010/9/3</start> <end>2010/12/16</end> </Duration> <Time> <day>Monday</day> <start>10:00</start> <end>11:30</end> </Time> </Class> <Class> <grade>2</grade> <type>S</type> <LessonNumbering> <courseNumbering>COMP214</courseNumbering> <classNumbering>21121</classNumbering> </LessonNumbering> <name>计算机网络</name> <teacher>林灿堂</teacher> <room>A309</room> <Duration> <start>2010/9/3</start> <end>2010/12/16</end> </Duration> <Time> <day>Friday</day> <start>11:30</start> <end>13:00</end> </Time> </Class> <Class> <grade>2</grade> <type>S</type> <LessonNumbering> <courseNumbering>MATH211</courseNumbering> <classNumbering>21121</classNumbering> </LessonNumbering> <name>统计学 I</name> <teacher>容佑江</teacher> <room>A309</room> <Duration> <start>2010/9/3</start> <end>2010/12/16</end> </Duration> <Time> <day>Monday</day> <start>14:30</start> <end>16:00</end> </Time> </Class> …………</Classes>
我想用XSL生成如下的表格
请问用XSL是不是太不给力了?能不能实现呢?
[解决办法]
用嵌套表格,每天一个td
在每天中,再根据课程情况写表格,或用CSS控制显示。
把每天中的所有课程取出并排序,根据每门课程的的时间写一个新的一列多行的TABLE。
[解决办法]
这如果要用XSLT实现当然可以,只不过你在计算时间上会比较麻烦,不管你是不是用XSLT都麻烦。
下面是简单的计算时间,只是提供一个参考,并不准确,详细lz自己写吧,利用JS可能会方便些。
- XML code
<?xml version="1.0" encoding="GB2312"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:key name="day" match="/Classes/Class/Time/day" use="."/> <xsl:template match="/Classes"> <table> <tbody> <tr> <xsl:for-each select="Class/Time/day[generate-id()=generate-id(key('day',.))]"> <td valign="top"> <table> <xsl:apply-templates select="/Classes/Class[Time/day=current()]"> <xsl:sort select="Time/start" order="ascending"/> </xsl:apply-templates> </table> </td> </xsl:for-each> </tr> </tbody> </table> </xsl:template> <xsl:template match="Class"> <xsl:variable name="Height" select="(number(substring-before(Time/end, ':') )-number(substring-before(Time/start, ':'))-1)*40" /> <tr> <th style="border: 1px solid black; height:{$Height}px"><xsl:value-of select="name"/> </th> </tr> </xsl:template></xsl:stylesheet>