xsl排序不排序?

时间:2012-11-21 14:05:33

标签: xml xslt

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"/>

2 个答案:

答案 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>元素的上下文中找到姓氏。