2015-03-25 35 views
0

对于我定义的变量,我将从每个组的标签中获取一个值。我喜欢用这个变量来从另一个标签获取价值。如何从每个组的标签中获取一个值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 
+0

请发布您的预期输出(3)。 – 2015-03-25 00:14:30

+0

** 1。**你的例子很混乱,因为(a)你是由学生分组的,你的XML有两个学生,但你的结果只显示一个; (b)当每个学生只有一个记录时,你为什么按学生分组?和(c)为什么你使用两个学生都与两个(会议?)有关的例子?你如何能够告诉成功失败? - ** 2。**为什么你不使用(或至少试图使用)**键**将会议链接到学生 - 如[上一个问题]所示(http:// stackoverflow .COM /问题/ 29199680 /)? – 2015-03-25 05:12:24

回答

0

正如在评论中提到,目前尚不清楚为什么你想组学生时,有(可能)每名学生只有一条记录,它看起来像无论如何,你传递一个参数来获得一个特定的学生。所以,你可以这样做只是这

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

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

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

在回答你的问题,从student可以定义一个关键

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

然后你可以使用键来查找note当前veranstaltung得到note像这样

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

试试这个XSLT(注意,为了简化它不会输出螺柱的所有区域ENT)。

<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,而是反复遍历note元素。试试这个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:key name="veranstaltung" match="veranstaltung" use="veranstaltungsnummer" /> 

    <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 select="leistungen/noten/note"> 
       <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="." /> 
       <xsl:text>&#10;</xsl:text> 
       <xsl:text>&#10;</xsl:text> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 
相关问题