lecturer.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="html" version="4.0"/>
<xsl:template match="/">
<html>
<head>
<title>Lecturer Information</title>
</head>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>Name</th>
<th>Teaching</th>
<th>Research</th>
</tr>
<xsl:for-each select="lecturers/lecturer">
<tr>
<td>
<xsl:apply-templates select="name">
<xsl:sort select="@last" data-type="text" order="descending"/>
</xsl:apply-templates>
</td>
<td><xsl:apply-templates select="teaching/course" /></td>
<td><xsl:value-of select="research"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
<!-- Templates HERE -->
<xsl:template match="name">
<xsl:value-of select="@title"/><xsl:text> </xsl:text>
<xsl:value-of select="@first"/><xsl:text> </xsl:text>
<xsl:value-of select="@last"/>
</xsl:template>
<xsl:template match="teaching/course">
<xsl:for-each select=".">
<xsl:value-of select="concat(. , '(',@code, ')')"/> <br />
<!-- <xsl:value-of select="."/> (<xsl:value-of select="@code"/>) -->
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
lecturer.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="lecturer.xsl" ?>
<!DOCTYPE lecturers [
<!ELEMENT lecturers (lecturer+)>
<!ELEMENT lecturer (name, teaching, research)>
<!-- Element name must contain attribute title, first and last -->
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
title CDATA #REQUIRED
first CDATA #REQUIRED
last CDATA #REQUIRED
>
<!-- Teaching can have more than one course-->
<!ELEMENT teaching (course+)>
<!ELEMENT course (#PCDATA)>
<!ATTLIST course
code CDATA #REQUIRED
>
<!ELEMENT research (#PCDATA)>
]>
<lecturers>
<lecturer>
<name title="Professor" first="Peter" last="Quirk"/>
<teaching>
<course code="CO3070">XML and the Web</course>
<course code="CO3300">Web Server Architectures</course>
</teaching>
<research>
The application of Web protocols to Biology
</research>
</lecturer>
<lecturer>
<name title="Mr" last="Abdi" first="Ahmet"/>
<teaching>
<course code="CO1337">Ahmet's Course</course>
</teaching>
<research>
The Best Research In the world.
</research>
</lecturer>
</lecturers>
这部分xsl似乎没有排序
<xsl:sort select="@last" data-type="text" order="descending"/>
答案 0 :(得分:4)
我相信这行
<xsl:sort select="name/@last" data-type="text" order="descending"/>
需要在for-each
声明
<xsl:for-each select="lecturers/lecturer">
这应该按照姓氏对所有讲师进行排序。
答案 1 :(得分:3)
您有<xsl:sort>
元素作为<xsl:apply-templates select="name">
的子元素,但您不需要在那里进行任何排序,因为在给定的上下文中只有一个名称。
相反,您需要让<xsl:sort>
成为<xsl:for-each>
的孩子:
<xsl:sort select="name/@last" data-type="text" order="descending"/>
确保更改显示的select
属性,以便排序能够从<lecturer>
元素的上下文中找到姓氏。