如何从每个组xslt的标签中获取值

时间:2015-03-25 00:01:40

标签: xml variables xslt

对于我定义的变量,我将从每个组的标签中获取一个值。这个变量我想用来从另一个标签中获取价值。

首先,我从xml中截取屏幕截图以了解:

enter image description here

这是我的xslt代码中的截图,用于理解:

enter image description here

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 veranstaltungsnummer="754125">1.7</note>
                <note veranstaltungsnummer="452781">2.7</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 veranstaltungsnummer="754125">1.0</note>
                <note veranstaltungsnummer="452781">1.7</note>
            </noten>
        </leistungen>
    </student>
    </studenten>
    <veranstaltungen>
        <veranstaltung>
            <veranstaltungsnummer>754125</veranstaltungsnummer>
            <veranstaltungstitel>Einführung in die Politikwissenschaft</veranstaltungstitel>
            <dozent>Prof. Dr. Schnatterberg</dozent>
            <modul>EM 1</modul>
        </veranstaltung>
        <veranstaltung>
            <veranstaltungsnummer>452781</veranstaltungsnummer>
            <veranstaltungstitel>Theorien der Politik</veranstaltungstitel>
            <dozent>Dr. Hummels</dozent>
            <modul>EM 2</modul>
        </veranstaltung>
    </veranstaltungen>
</unidatenbank>

XSLT代码:

<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"/>
    <xsl:param name="matrikelnummer" select="2367897"/> 
    <xsl:template match="/unidatenbank"> 
            <xsl:for-each-group select="studenten/student[daten/matrikelnummer=$matrikelnummer]" group-by="daten">
            <xsl:text>Persönlicher Transkript:
            </xsl:text>
                <xsl:value-of select="vorname"/>
            <xsl:value-of select="current-grouping-key()" />
            </xsl:for-each-group>
            <xsl:for-each-group select="veranstaltungen" group-by="veranstaltung">   
                <xsl:variable name="veranstaltungsnummer" select="./veranstaltungsnummer"/>
                <xsl:value-of select="current-grouping-key()" />
                <xsl:text>Note: 
                </xsl:text>
                <xsl:value-of select="$veranstaltungsnummer"/>
                <xsl:for-each select="studenten/student">
                    <xsl:value-of select="./leistungen/noten/note[@veranstaltungsnummer=$veranstaltungsnummer]"/>
                </xsl:for-each> 
            </xsl:for-each-group>
     </xsl:template>
     </xsl:stylesheet>

Here是我的xsltransform代码示例。

我会得到这个输出:

Persönlicher Transkript:

            2367897
            Isabella
            Gans
            08.08.1988
            Politikwissenschaft

            754125
            Einführung in die Politikwissenschaft
            Prof. Dr. Schnatterberg
            EM 1
        Note: 1.0

            452781
            Theorien der Politik
            Dr. Hummels
            EM 2
        Note: 1.7

1 个答案:

答案 0 :(得分:0)

正如评论中所提到的,当每个学生(可能)只有一个记录时,你是否试图对学生进行分组并不清楚,看起来你传递一个参数来得到一个特定的学生。所以,你可以做到这一点

<xsl:for-each select="studenten/student[daten/matrikelnummer=$matrikelnummer]" >

然后,您对veranstaltungen个节点进行分组,但看起来只有其中一个节点,所以您可能真的是指子veranstaltung个元素。同样,看起来你不需要对它们进行分组。就这样做

<xsl:for-each select="veranstaltungen/veranstaltung">   

在回答您的问题时,要从note获取student,您可以定义密钥

<xsl:key name="student" match="student" use="daten/matrikelnummer" />

然后您可以使用该密钥查找当前note的{​​{1}},如此

veranstaltung

试试这个XSLT(请注意,为了简化事情,它不会输出学生的所有字段。)

<xsl:value-of select="key('student',string($matrikelnummer))
                      /leistungen/noten/note[@veranstaltungsnummer = $veranstaltungsnummer]" />

话虽如此,我不确定你是否需要迭代<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"/> <xsl:param name="matrikelnummer" select="2367897"/> <xsl:key name="student" match="student" use="daten/matrikelnummer" /> <xsl:template match="/unidatenbank"> <xsl:for-each select="studenten/student[daten/matrikelnummer=$matrikelnummer]" > <xsl:text>Persönlicher Transkript:&#10;&#10;</xsl:text> <xsl:value-of select="daten/vorname"/> <xsl:text>&#10;</xsl:text> <xsl:value-of select="$matrikelnummer" /> <xsl:text>&#10;&#10;</xsl:text> </xsl:for-each> <xsl:for-each select="veranstaltungen/veranstaltung"> <xsl:variable name="veranstaltungsnummer" select="veranstaltungsnummer"/> <xsl:value-of select="$veranstaltungsnummer" /> <xsl:text>&#10;</xsl:text> <xsl:text>Note: </xsl:text> <xsl:value-of select="key('student', string($matrikelnummer))/leistungen/noten/note[@veranstaltungsnummer = $veranstaltungsnummer]" /> <xsl:text>&#10;</xsl:text> <xsl:text>&#10;</xsl:text> </xsl:for-each> </xsl:template> </xsl:stylesheet> 元素。您可以嵌套veranstaltung并迭代xsl:for-each元素。试试这个XSLT:

note