XSLT / XML嵌套用于每个循环

时间:2014-04-08 05:58:17

标签: html xml xslt xpath

我根据网站上的信息创建了这个xml文件。由于它包含大量信息,我将发布一个简化版本。

这意味着使用xslt文件来显示和模仿学院或大学课程的示例,其结构如下: 有多个课程要显示,这就是为什么它从课程开始然后我们有课程存储每个课程。

这里有教师和其他描述的课程信息。然后我们搬到这一年,课程可以有任意数年,这就是为什么我们把年份ynum =" 1"每年有2个学期。在学期内有多个单元,所以我们将单元/单元存储起来。

这是我希望它看起来像是给你一个想法的目标输出。

我已将所有信息存储在xml中,这是我想通过xslt实现的输出,但我不确定如何在此级别启动它:http://puu.sh/80sBi/0107a6264e.png

这是我的代码:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="Courses.xslt"?>

<courses>
  <course>computing
    <course_info></course_info>
    <teacher etc>
      <details></details>
    </teacher etc>

  <year ynum="1">
   <semester snum="1">
    <units>
     <unit>
        <code></code>
        <title></title>     <!-- this is the "description" table title -->
        <credit_points></credit_points>
     </unit>
     <unit>
        <code></code>
        <title></title>
        <credit_points></credit_points>
     </unit>
   </units>
 </semester>
 <semester snum="2">
  <units>
   <unit>
      <code></code>
      <title></title>
      <credit_points></credit_points>
   </unit>
 </units>
 </semester>
</year>
<year ynum="2">
  <semester snum="1">
    <units>
      <unit>
        <code></code>
        <title></title>
        <credit_points></credit_points>
      </unit>
    </units>
    </semester>
    <semester snum="2">
     <units>
      <unit>
      </unit>
     </units>
    </semester>
   </year>
  </course>
 </courses>

我对xslt文件的失败尝试:/任何建议或帮助都会非常感激,因为我似乎无法理解如何使循环工作这样的例子。

<?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>
<h2>Course information</h2>



 <xsl:for-each select="courses/course">
 <strong>Course:</strong><xsl:value-of select="course"/><br />
   <strong>Code:</strong><xsl:value-of select="code"/><br />
   <strong>Course Coordinaotr</strong><xsl:value-of select="fname"/><xsl:text> </xsl:text><xsl:value-of select="sname"/></li>



   <table border="0">
   <tr>
   <th>unit</th>
   <th>description</th>
   <th>Credit Points</th>
   </tr>

   <xsl:for-each select="year/semester">
   <tr>
   <td><strong>Client ID:</strong><xsl:value-of select="unit_code"/></td>
   <td><strong>OrderDate:</strong><xsl:value-of select="unit_title"/></td>
   <td><strong>Quantity Ordered:</strong><xsl:value-of select="cp"/></td>
   <td><strong>Order Status:</strong><xsl:value-of select="additional_link"/></td>

   </xsl:for-each>
   </tr>


   </table>
 </xsl:for-each>
</body>
</html>
</xsl:template></xsl:stylesheet>

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可能会发现最好使用 xsl:apply-templates ,而不是 xsl:for-each 。模板匹配是XSLT的主要优势之一。它减少了压痕,可以使XSLT更清洁。因此,不要执行<xsl:for-each select="courses/course">,而是执行此操作

 <xsl:apply-templates select="courses/course" />

然后,您将拥有一个匹配课程的模板,您可以在其中输出任何主标题信息,然后选择元素

<xsl:template match="course">
    <strong>Course:</strong> <xsl:value-of select="text()" /><br />
    <xsl:apply-templates select="year" />
</xsl:template>

模板类似,但看起来您希望每学期输出年份信息。因此,您的模板可能如下所示

<xsl:template match="year">
    <xsl:apply-templates select="semester" />
</xsl:template>

然后学期模板会开始看这个

<xsl:template match="semester">
    <strong>Year:</strong><xsl:value-of select="../@ynum"/><br />
    <strong>Semester:</strong><xsl:value-of select="@snum"/><br />

(严格来说,您可能会放弃模板,在这种情况下只执行<xsl:apply-templates select="year/semester" />

然后只是以类似的方式为表格行选择单位元素。

尝试将此XSLT作为入门者:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
        <body>
        <h2>Course information</h2>
        <xsl:apply-templates select="courses/course" />
        </body>
        </html>
    </xsl:template>

    <xsl:template match="course">
        <strong>Course:</strong> <xsl:value-of select="text()" /><br />
        <xsl:apply-templates select="year" />
    </xsl:template>

    <xsl:template match="year">
        <xsl:apply-templates select="semester" />
    </xsl:template>

    <xsl:template match="semester">
        <strong>Year:</strong><xsl:value-of select="../@ynum"/><br />
        <strong>Semester:</strong><xsl:value-of select="@snum"/><br />
        <table border="0">
            <tr>
                <th>unit</th>
                <th>description</th>
                <th>Credit Points</th>
            </tr>
            <xsl:apply-templates select="units/unit" />
        </table>
    </xsl:template>

    <xsl:template match="unit">
        <tr>
            <td><xsl:value-of select="code"/></td>
            <td><xsl:value-of select="title"/></td>
            <td><xsl:value-of select="credit_points"/></td>
        </tr>
    </xsl:template>
</xsl:stylesheet>