MarcL
MarcL

Reputation: 3593

XSLT: How can I sort for an element?

I want to transform an xml into another xml file with a xslt sheet: but when I transform this, the output of the year nobelprize is still not in correct order... how can I do it correctly?

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="ISO-8859-1" indent="yes" method="xml" />


    <xsl:template match="/">
        <nobelpreisträger>
            <xsl:apply-templates>

            </xsl:apply-templates>
        </nobelpreisträger>
    </xsl:template>

    <xsl:template match="autor">        
        <Name>
        <xsl:value-of select="nachname"/>
        </Name>
        <Vorname>
        <xsl:apply-templates select="vorname"/>
        </Vorname>
        <JahrNobelpreis>
            <xsl:apply-templates select="nobelpreis" >
                <xsl:sort select="nobelpreis" order="ascending" />
            </xsl:apply-templates>          
        </JahrNobelpreis>       
    </xsl:template>
</xsl:stylesheet>

my original xml file:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE autoren SYSTEM "autoren.dtd">
<autoren>
    <autor>
        <nachname>Prudhomme</nachname>
        <vorname>Sully</vorname>
        <nobelpreis>1901</nobelpreis>
        <sprache>französisch</sprache>
        <buch>
            <titel>t1888</titel>
            <erscheinungsjahr>1888</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Hauptmann</nachname>
        <vorname>Gerhard</vorname>
        <nobelpreis>1912</nobelpreis>
        <sprache>deutsch</sprache>
        <buch>
            <titel>t1900</titel>
            <erscheinungsjahr>1900</erscheinungsjahr>
        </buch>
        <buch>
            <titel>t1901</titel>
            <erscheinungsjahr>1901</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>France</nachname>
        <vorname>Anatol</vorname>
        <nobelpreis>1921</nobelpreis>
        <sprache>französisch</sprache>
        <buch>
            <titel>t1900</titel>
            <erscheinungsjahr>1900</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Lagerlöf</nachname>
        <vorname>Selma</vorname>
        <nobelpreis>1909</nobelpreis>
        <sprache>schwedisch</sprache>
        <buch>
            <titel>t1900</titel>
            <erscheinungsjahr>1900</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Hemingway</nachname>
        <vorname>Ernest</vorname>
        <nobelpreis>1954</nobelpreis>
        <sprache>englisch</sprache>
        <buch>
            <titel>t1965</titel>
            <erscheinungsjahr>1965</erscheinungsjahr>
        </buch>
        <buch>
            <titel>t1951</titel>
            <erscheinungsjahr>1951</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Cornwell</nachname>
        <vorname>Patricia</vorname>
        <sprache>englisch</sprache>
        <buch>
            <titel>From Potter's Field</titel>
            <erscheinungsjahr>1995</erscheinungsjahr>
        </buch>
        <buch>
            <titel>t1995</titel>
            <erscheinungsjahr>1995</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Böll</nachname>
        <vorname>Heinrich</vorname>
        <nobelpreis>1972</nobelpreis>
        <sprache>deutsch</sprache>
        <buch>
            <titel>t1969</titel>
            <erscheinungsjahr>1969</erscheinungsjahr>
        </buch>
        <buch>
            <titel>t1965</titel>
            <erscheinungsjahr>1965</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Gide</nachname>
        <vorname>André</vorname>
        <nobelpreis>1947</nobelpreis>
        <sprache>französisch</sprache>
        <buch>
            <titel>t1945</titel>
            <erscheinungsjahr>1945</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Mann</nachname>
        <vorname>Thomas</vorname>
        <nobelpreis>1929</nobelpreis>
        <sprache>deutsch</sprache>
        <buch>
            <titel>t1930</titel>
            <erscheinungsjahr>1930</erscheinungsjahr>
        </buch>
        <buch>
            <titel>t1910</titel>
            <erscheinungsjahr>1910</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Mann</nachname>
        <vorname>Heinrich</vorname>
        <sprache>deutsch</sprache>
        <buch>
            <titel>t1920</titel>
            <erscheinungsjahr>1920</erscheinungsjahr>
        </buch>
    </autor>

    <autor>
        <nachname>Faulkner</nachname>
        <vorname>William</vorname>
        <nobelpreis>1949</nobelpreis>
        <sprache>englisch</sprache>
        <buch>
            <titel>t1930</titel>
            <erscheinungsjahr>1930</erscheinungsjahr>
        </buch>
        <buch>
            <titel>t1932</titel>
            <erscheinungsjahr>1932</erscheinungsjahr>
        </buch>
    </autor>

</autoren>

Upvotes: 0

Views: 32

Answers (1)

rene
rene

Reputation: 42444

You are too late with adding your sort clause, you have to do it when the template containg the element is being applied.

This sorts fine for me:

  <xsl:template match="autoren">
    <xsl:apply-templates select="autor">
      <xsl:sort select="nobelpreis" order="ascending" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="autor">
    <Name>
      <xsl:value-of select="nachname"/>
    </Name>
    <Vorname>
      <xsl:apply-templates select="vorname"/>
    </Vorname>
    <JahrNobelpreis>
      <xsl:apply-templates select="nobelpreis" />
    </JahrNobelpreis>
  </xsl:template>

Upvotes: 3

Related Questions