xslt и xpath: соответствуют двум атрибутам узла - PullRequest
1 голос
/ 17 мая 2009

с учетом следующего 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 ]

1 голос
/ 17 мая 2009

Проблема в пропусках:

<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"/>
0 голосов
/ 17 мая 2009

Я разработал этот пример как раз перед тем, как вы уже получили хороший ответ. Так как это немного другой подход, я все равно решил опубликовать его.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...