2016-06-07 10 views
-1

Ich bin ziemlich neu in XSL und ein Problem beim Transformieren einer XML-Datei mit XSL. Mein xml wie folgt aussieht:Erhalten oberen Tag-Wert in Abhängigkeit von Low-Level-Attribute

<studentlist> 
    <student name="Peter"> 
    <sem name="5> 
    <mod name="science"/> 
    </sem> 
    </student> 
    ... 
    ... 
    </studentlist> 

Es gibt mehr Studenten in diesem studentlist und ich möchte alle Namen der Schüler extrahieren, die zum Beispiel Studie Wissenschaft so dass der Ausgang dieses möchte: Wissenschaft: Peter, Will, Jeffrey

Ich verwende eine Vorlage passend "Studentlist/Student/sem/mod". Ich kann jedes Modul mit diesem Matcher extrahieren, aber die Probleme sind: 1. Repetitive Matches werden immer angezeigt, die ich vermeiden möchte 2. Ich kann den Studentennamen von diesem Punkt nicht erreichen und auch wenn, ich habe keine Ahnung Wie erstelle ich eine Liste meiner Ergebnisse?

Ich habe versucht, dies zu lösen, indem ich ein inneres for-each verwende, aber hier scheinen entweder absolute Pfade oder relative Pfade zu funktionieren.

Könnte mir jemand helfen oder mir einen Hinweis geben, wie man das erreicht, eigentlich einfaches Problem, mit XSL?

Edit: die Struktur von meinem XML wird nicht angezeigt. Ich werde es später auf meinem Computer bearbeiten.

Edit: Ich verwende XSLT 2.0. Die Sache ist, ich habe mehr Module, nicht nur Wissenschaft (aber die Struktur innerhalb der XML bleibt gleich). Z.B. Da sind Politik, Sprachen, usw. Also möchte ich alle Schüler in einer Liste zeigen, die vom Modul abhängt. Der Ausgang würde ich aussehen will wie: Wissenschaft: Peter, Jeffrey, ... Politik: Vivien, Sarah, Antonio, ... Sprachen: Hans, Fiola, Béatrice, ...

Ich hatte früher ein ähnliches Ergebnis, aber ich habe zu viel verändert und kann die alte Version nicht mehr erreichen. Aber ich hatte so etwas wie: Wissenschaft: Peter Wissenschaft: Jeffrey Politik: Vivien Politik: Sarah

Und das ist, was ich mit "repetitve" gemeint. Ich konnte es mir nicht leisten, alle Schüler hinter dem Modul aufzulisten.

Dies ist meine aktuelle XSL, allerdings nicht funktioniert ..

<xsl:template match="studentlist/student/sem/mod"> 
<xsl:for-each select="./name"> 
    <xsl:variable name="currName" select="name"/> 
    <xsl:for-each select="studentlist/student/sem/[email protected]"> 
     <xsl:if test="$currName = $name"> 
      <xsl:text>$currName = $name</xsl:text> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:for-each> 

+0

Ihre Frage ist nicht klar genug. Bitte posten Sie Ihre XSLT und die erwartete Ausgabe (als Code). - Ich bin auch verwirrt, was meinst du mit "sich wiederholenden Übereinstimmungen" - hat deine Liste mehrere Einträge für denselben Schüler? - Geben Sie schließlich an, ob XSLT 1.0 oder 2.0 verwendet wird. –

+0

@ michael.hor257k Ich habe meinen Startbeitrag aktualisiert. Ihr Ergebnis scheint ein guter Anfang zu sein. Ich hoffe, dass mein redigierter Beitrag die Dinge aufklärt. – BlackACE

+0

Sie möchten also die Schüler nach Themen gruppieren? –

Antwort

0

Ich möchte alle Namen der Schüler zum Beispiel der, extrahieren, studieren Wissenschaft so die Ausgabe dieses Thema erhalten möchte : Wissenschaft: Peter, Will, Jeffrey

Anscheinend möchten Sie die Studenten nach Thema gruppieren - also warum tun Sie nicht genau das?

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text" encoding="UTF-8"/> 

<xsl:template match="/studentlist"> 
    <xsl:for-each-group select="student" group-by="sem/mod/@name"> 
     <xsl:value-of select="current-grouping-key()" /> 
     <xsl:text>: </xsl:text> 
     <xsl:value-of select="current-group()/@name" separator=", "/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:for-each-group> 
</xsl:template> 

</xsl:stylesheet> 
+0

Das scheint ziemlich gut zu sein! Was ist, wenn die Schüler mehr Fächer haben? ZB Peter und Vivien lernen Sprachen? – BlackACE

+0

Es sollte immer noch funktionieren (Ich habe die unnötige Annahme entfernt). –

Verwandte Themen