xslt和xpath:匹配两个节点属性

时间:2009-05-16 20:11:54

标签: xslt

给出以下xml:

<student studentID="001"> 
    <dateOfBirth> 1-1-1990 </dateOfBirth>
    <name> Ayse Ozer </name>
    <sex> F </sex>
    <takes> CMPE351 </takes>
    <takes> CMPE111 </takes>
<takes> CMPE418 </takes>
 </student>

 <student studentID="002"> 
    <dateOfBirth> 2-2-1992 </dateOfBirth>
    <name> Bircan Korkmaz </name>
    <sex> F </sex>
    <takes> CMPE418 </takes>
    <takes> CMPE111 </takes>
<takes> CMPE352 </takes>
    </student>

<course courseCode="CMPE351">
     <courseName>
           Database systems I
     </courseName>
     <description>
         First course in databases
     </description>       
 </course>

 <course courseCode="CMPE111">
     <courseName>
           Introduction to C
     </courseName>
     <description>
         First course in programming
     </description>       
 </course>

 <course courseCode="CMPE352">
     <courseName>
           Database systems II
     </courseName>
     <description>
         Second course in databases
     </description>       
 </course>

 <course courseCode="CMPE418">
     <courseName>
           Internet Programming
     </courseName>
     <description>
         Programming for the Internet.
     </description>       
 </course>

我想要那样的输出

学生的课程:

* Ayse Ozer
      o CMPE351 Database systems I
      o CMPE111 Introduction to C
* Bircan Korkmaz
      o CMPE418 Internet Programming
      o CMPE111 Introduction to C

我写了这个xsl代码:

<xsl:template match = "school">
<head>
<title>Student</title>    
 </head>
 <body>
 <p>Courses Taken By Students:</p>
   <xsl:for-each select = "student">
 <ul>
 <li><xsl:value-of select = "name"/> </li>    
 <xsl:for-each select = "takes">
 <ul>
 <li><xsl:value-of select="text()" />
<xsl:value-of select = "../../course[@courseCode=text()]/courseName"/> </li>
 </ul> 
</xsl:for-each>
 </ul>  
    </xsl:for-each>
 </body>
 </xsl:template>

 <xsl:value-of select = "../../course[@courseCode=text()]/courseName"/>
 Problem about above line about text()

2 个答案:

答案 0 :(得分:1)

问题是空白:

<takes> CMPE351 </takes>

应该是:

<takes>CMPE351</takes>

我会尽力弥补......路上的例子...... 为了避免很多问题(并提高性能),我还将使用xsl索引......


修正(警告 - 它不适用于在中间中有多个空格的课程代码,但这似乎不太可能):

<xsl:variable name="code" select="normalize-space()"/>
<ul>
  <li>
    <xsl:value-of select="$code"/>
    <xsl:value-of select="key('courses',$code)/courseName"/>
  </li>
</ul>

(在顶部)xsl索引:

<xsl:key name="courses" match="/school/course" use="@courseCode"/>

答案 1 :(得分:0)

在你已经得到一个好答案之前,我已经开始研究这个例子了。由于这只是一种略微不同的方法,我认为无论如何我都会发布它。


<?xml version="1.0" encoding="utf-8"?>

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

  <xsl:output method="html" indent="no" encoding="UTF-8" omit-xml-declaration="yes" />

  <xsl:key name="courses" match="course" use="@courseCode"/>

  <xsl:template match="school">
      <html>
        <body>
          <p>Courses taken by:</p>
          <ul>
            <xsl:apply-templates select="student"/>
          </ul>
        </body>
      </html>
  </xsl:template>

  <xsl:template match="student">
    <li>
      <xsl:value-of select="name"/>
      <ul>
        <xsl:apply-templates select="takes"/>
      </ul>
    </li>
  </xsl:template>

  <xsl:template match="takes">
    <li>
      <xsl:value-of select="."/>
      <xsl:value-of select="key('courses', normalize-space(.))/courseName"/>
    </li>
  </xsl:template>

</xsl:stylesheet> 

相关问题