Announcement

Collapse
No announcement yet.

Abfrage von IDs über Geschwisterknoten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfrage von IDs über Geschwisterknoten

    Hallo,

    Ich komme leider nicht weiter.
    Hier meine XML Struktur
    Code:
    <DATA>
     <Raum id=1 name="R101" />
     <Raum id=2 name="R102" />
     <Klasse id =10 name="8a" />
     <Klasse id =20 name="9a" />
     <Klasse_Raum id=100 raum=1 klasse=20 />
     <Klasse_Raum id=200 raum=2 klasse=20 />
    </DATA>
    Ich möchte per xsl eine Abfrage generieren die mir für die Klasse 8a die Räume ausgibt und zwar nicht als ID sondern mit deren Namen.
    Geht das ohne die Verwendung von Variablen? (Das eigentliche XML-Dokument ist Komplexer.
    Mir fehlt ein Ansatz. Hat jemand einen Tip?
    Vielen Dank,
    Thomas

  • #2
    Bei Klasse 8a steht als ID 10. Wo ist hier der Bezug zum Rest?

    Comment


    • #3
      Ok Sorry vielleicht war das etwas zu kurz beschrieben.
      Ich wollte damit nur beschreiben, dass es für mehrere Elemente 'Klasse! 'Raum' und 'Klasse_Raum' gibt.

      Die Abfrage soll im einfachsten Fall folgendes Ergebniss ergeben:

      Klasse 9a Raum R101 Raum R102

      Comment


      • #4
        Sind die Daten wirklich so schwach strukturiert? Ich würde im vorliegenden Fall die der Klasse 9a folgenden Elemente Klasse_Raum mit der ID 20 suchen und dann den passenden Raum auslesen. Vermutlich geht das mit einer strukturierteren Form besser.

        Comment


        • #5
          Teste mal folgende Struktur:
          Code:
          <DATA>
          <Raum>
          <id>1</id> <name>R101</name>
          </Raum>
          <Raum>
          <id>2</id> <name>R102</name>
          </Raum>
          <Klasse>
          <id>10</id> <name>8a</name>
          </Klasse>
          <Klasse>
          <id>20</id> <name>9a</name>
          </Klasse>
          <Klasse_Raum>
          <id>100</id> <raumid>1</raumid> <klasseid>20</klasseid>
          </Klasse_Raum>
          <Klasse_Raum>
          <id>200</id> <raumid>2</raumid> <klasseid>10</klasseid>
          </Klasse_Raum>
          </DATA>

          Und dann liest du folgendermaßen aus:
          HTML Code:
          <?xml version="1.0" encoding="UTF-8"?>
          
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          	<xsl:template match="/">
          		<html>
          			<body>
          				<table width="50%" cellspacing="0" cellpadding="0" style="font-family:verdana;font-size:X-Small" border="1">
          					<tr bgcolor="#336699">
          						<th align="left">
          							<font color="White">Klasse</font>
          						</th>
          						<th align="left">
          							<font color="White">Raum Name</font>
          						</th>
          					</tr>
          						<xsl:for-each select="DATA/Klasse_Raum">
          						<tr>
          							<td align="right">
          								<xsl:value-of select="/DATA/Klasse[id = current()/klasseid]/name"/>
          							</td>
          							<td align="right">
          								<xsl:value-of select="/DATA/Raum[id = current()/raumid]/name"/>
          							</td>
          						</tr>
          					</xsl:for-each>
          				</table>
          			</body>
          		</html>
          	</xsl:template>
          </xsl:stylesheet>

          Hab dir unten eine Test.zip Datei angehängt. Wenn du die XML Datei mit dem Internetexplorer öffnest erhälst du eine Tabelle mit dem gewünschten Ergebnis. Welches du jetzt mit der neuen (meiner Meinung nach besseren) Strunktur beliebig erweitern kannst!
          Attached Files
          Zuletzt editiert von das-d; 02.09.2008, 22:31.
          Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

          Comment


          • #6
            Vielen Dank für die Mühe. Großartig. Leider hilft's mir nicht weiter.
            Ich weiß dass die XML-Struktur schlecht ist, an der kann ich allerdings nichts ändern. Ich nehme mal an die wurde aus einer relationalen Datenbank generiert.
            Es bleibt die Frage:
            Kann ich über die ID-Verknüpfungen im ELEMENT "Klasse_Raum" in den Geschwisterelementen irgendwie den Namen der Klasse und des Raumes in der Ergebnisliste erhalten ohne Variablen zu benutzen?

            @Thomas: Wollte damit nur zeigen, dass die wirkliche XML mehrere Elemente "Klasse", "Raum" und "Klasse_Raum" hat. Außerdem gibt es noch 'Unterricht' 'Lehrer' etc. Was mir fehlt ist eine Idee wie ich die ID-Verknüpfungen in Namen auflösen kann. Habe schon mit 'preceding-sibling' rumprobiert komme aber nicht wirklich weiter, da ich in sachen XML noch am Anfang stehe.

            Comment


            • #7
              Versuch:
              Code:
              <xsl:template match="DATA">
                <xsl:apply-templates select="Klasse"/>
              </xsl:template>
              
              <xsl:template match="Klasse">
                <xsl:text>Klasse </xsl:text><xsl:value-of select="@name"/><xsl:text>: </xsl:text>
                
                <xsl:for-each select="following-sibling::Klasse_Raum[@klasse = current()/@id]">
                   <xsl:text>Raum </xsl:text>
                   <xsl:value-of select="preceding-sibling::Raum[@id = current()/@raum]/@name"/>
                   <xsl:if test="position()!=last()"><xsl:text> | </xsl:text></xsl:if>
                </xsl:for-each><br />   
              </xsl:template>
              Ergebnis:

              Klasse 8a:
              Klasse 9a: Raum R101 | Raum R102

              Comment


              • #8
                SUPER. Das war genau der Anstoss, den ich brauchte.
                Tausend Dank.

                Comment

                Working...
                X