如何在for-each循环xsl中使用参数

时间:2015-01-24 17:54:40

标签: xml xslt parameters foreach xslt-2.0

对于我的输出我只需要一个特殊参数(matrikelnummer)

这是我的XML代码:

<?xml version="1.0" encoding="UTF-8"?>
<unidatenbank>
    <studenten>
    <student>
        <daten>
            <matrikelnummer>2354444</matrikelnummer>
            <vorname>Horst</vorname>
            <nachname>Wallenstein</nachname>
            <geburtsdatum>09.09.1999</geburtsdatum>
            <studiengang>Politikwissenschaft</studiengang>
        </daten>
        <leistungen>
            <creditpoints>178</creditpoints>
            <noten>
                <note>1.7</note>
                <note>2.7</note>
                <note>3.2</note>
                <note>1.0</note>
            </noten>
        </leistungen>
    </student>
    <student>
        <daten>
            <matrikelnummer>2367897</matrikelnummer>
            <vorname>Isabella</vorname>
            <nachname>Gans</nachname>
            <geburtsdatum>08.08.1988</geburtsdatum>
            <studiengang>Politikwissenschaft</studiengang>
        </daten>
        <leistungen>
            <creditpoints>190</creditpoints>
            <noten>
                <note>1.0</note>
                <note>1.7</note>
                <note>1.7</note>
                <note>1.0</note>
            </noten>
        </leistungen>
    </student>
    </studenten>
    <veranstaltungen>
        <veranstaltung>
            <veranstaltungsnummer>754125</veranstaltungsnummer>
            <dozent>Prof. Dr. Schnatterberg</dozent>
            <modul>EM 1</modul>
        </veranstaltung>
        <veranstaltung>
            <veranstaltungsnummer>452781</veranstaltungsnummer>
            <dozent>Dr. Hummels</dozent>
            <modul>EM 2</modul>
        </veranstaltung>
    </veranstaltungen>
</unidatenbank>

这就是我的参数:

  <xsl:param name="matrikelnummer"
        select="2354444"
        as="xs:integer"
        required="no"/>

这是我的XSL代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:decimal-format decimal-separator=","
        grouping-separator="."/>
            <xsl:output method="text"/>
     <xsl:template match="/unidatenbank">
        <xsl:for-each select=".//studenten/student">
            <xsl:text>Vor- und Nachname: </xsl:text>
            <xsl:value-of select="./daten/vorname" />
                <xsl:text> </xsl:text>
                <xsl:value-of select="./daten/nachname" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Matrikelnr.: </xsl:text>
            <xsl:value-of select="./daten/matrikelnummer" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Studiengang: </xsl:text>
            <xsl:value-of select="./daten/studiengang" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Geburtsdatum: </xsl:text>
            <xsl:value-of select="./daten/geburtsdatum" />
            <xsl:text>&#xA;&#xA;</xsl:text>
            <xsl:text>Prüfungsnoten: </xsl:text>
            <xsl:value-of select="./leistungen/noten/note" />
            <xsl:text>&#xA;&#xA;</xsl:text>
            <xsl:text>Leistungspunkte: </xsl:text>
            <xsl:value-of select="./leistungen/creditpoints" />
            <xsl:text>&#xA;&#xA;</xsl:text>
            <xsl:text>Gesamtdurchschnitt: </xsl:text>
            <xsl:variable name="leistungen" select="avg(./leistungen/noten/note)" />
            <xsl:value-of select="format-number($leistungen, '#.##0,0')"/>
            <xsl:text>&#xA;&#xA;</xsl:text>
        </xsl:for-each>
        <xsl:for-each select=".//veranstaltungen/veranstaltung">
            <xsl:text>Veranstaltungsnummer: </xsl:text>
            <xsl:value-of select="./veranstaltungsnummer" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Dozent: </xsl:text>
            <xsl:value-of select="./dozent" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>Modul: </xsl:text>
            <xsl:value-of select="./modul" />
            <xsl:text>&#xA;</xsl:text>
            <xsl:text>&#xA;</xsl:text>
        </xsl:for-each>
        </xsl:template>       
</xsl:stylesheet>

我的输出必须如下所示:

Vor- und Nachname: Horst Wallenstein
Matrikelnr.: 2354444
Studiengang: Politikwissenschaft
Geburtsdatum: 09.09.1999

Prüfungsnoten: 1.7 2.7 3.2 1.0

Leistungspunkte: 178

Gesamtdurchschnitt: 2,2

我不知道如何以及在哪里将参数放在foreach循环中。希望可以有人帮帮我。

1 个答案:

答案 0 :(得分:1)

您不一定需要在这里使用xsl:for-each,但如果您愿意,可以这样做:

XSLT 2.0

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="text" encoding="utf-8"/>

<xsl:decimal-format decimal-separator="," grouping-separator="."/>

<xsl:param name="matrikelnummer" select="2354444"/>   

<xsl:template match="/unidatenbank">
    <xsl:for-each select="studenten/student[daten/matrikelnummer=$matrikelnummer]">
        <xsl:text>Vor- und Nachname: </xsl:text>
        <xsl:value-of select="daten/vorname" />
        <xsl:text> </xsl:text>
        <xsl:value-of select="daten/nachname" />
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Matrikelnr.: </xsl:text>
        <xsl:value-of select="daten/matrikelnummer" />
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Studiengang: </xsl:text>
        <xsl:value-of select="daten/studiengang" />
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Geburtsdatum: </xsl:text>
        <xsl:value-of select="daten/geburtsdatum" />
        <xsl:text>&#xA;&#xA;</xsl:text>
        <xsl:text>Prüfungsnoten: </xsl:text>
        <xsl:value-of select="leistungen/noten/note" />
        <xsl:text>&#xA;&#xA;</xsl:text>
        <xsl:text>Leistungspunkte: </xsl:text>
        <xsl:value-of select="leistungen/creditpoints" />
        <xsl:text>&#xA;&#xA;</xsl:text>
        <xsl:text>Gesamtdurchschnitt: </xsl:text>
        <xsl:variable name="leistungen" select="avg(leistungen/noten/note)" />
        <xsl:value-of select="format-number($leistungen, '#.##0,0')"/>
        <xsl:text>&#xA;&#xA;</xsl:text>
    </xsl:for-each>
    <xsl:for-each select="veranstaltungen/veranstaltung">
        <xsl:text>Veranstaltungsnummer: </xsl:text>
        <xsl:value-of select="veranstaltungsnummer" />
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Dozent: </xsl:text>
        <xsl:value-of select="dozent" />
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>Modul: </xsl:text>
        <xsl:value-of select="modul" />
        <xsl:text>&#xA;</xsl:text>
        <xsl:text>&#xA;</xsl:text>
    </xsl:for-each>
</xsl:template>  

</xsl:stylesheet>

请注意,这里没有“循环”; xsl:for-each指令仅用于建立上下文。