2009-05-16 7 views
1

дал следующий XML:XSLT и XPath: соответствуют два узла атрибутов

<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 

I w Rote этот 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() 
+0

В моем ответе я предполагал, что/школа является корневым узлом, и все остальное прямо под ... –

+0

Дальше - вы бы хорошо советовали использовать стандартный XML. Этот лишний пробел навредит вам, и даты должны следовать нормальному расположению; dateOfBirth из «2-2-1992» должен быть «1992-02-02» –

ответ

1

Проблема заключается в пробельные:

<takes> CMPE351 </takes> 

должно быть:

<takes>CMPE351</takes> 

Я постараюсь компенсировать ... пример в пути ... Чтобы избежать множества проблем (и повышения производительности), я буду также использовать индекс Xsl ...


Fixed (нюанс - это не будет работать с кодами курса с несколькими пробелами в средней из них, но это кажется маловероятным) :

<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

Вы правы в проблемных пространствах в узле узла. Также я изменил text() на current(), после чего он работал правильно thx. Но ваш код также очень много работает с пространством thx. – 2009-05-16 20:44:15

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> 

+0

Это не очень отличается ... то же самое использование normalize-space и xsl: key - единственное различие заключается в использовании переменной xsl: variable, которая не является важным отличием. –

+0

Правда, но небольшая разница, которую я имел в виду, это оригинальное использование xsl: for-each versus xsl: template здесь. – Mattio

Смежные вопросы