Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: XML-Datei mit dtd Datei darstellen

  Alt 20. Apr 2004, 08:37
Klar, ein paar Auszüge:
Code:
<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>
ist quasi eine Generalanweisung, alles noch kommende zu parsen. Und das erste, das da kommt, wäre dann dein <adressdb>-Knoten. (Edit: Die Reihenfolge ist dabei nicht wichtig, wollt´ ich nur so anmerken. Ich habe mir nur angewöhnt, die Templates in der Reihenfolge zu schreiben, in der die Knoten im Dokument auftauchen.)
Code:
<xsl:template match="adressdb">
  <html>
    <head>
      <title>AdressDB-Reader</title>
      <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
    </head>
    <body>
Zu beachten: obwohl es sich hier um HTML-Code handelt, befindest du dich ja immer noch in einer Datei mit XML-Format. Du musst also alle Einzeltags (wie
, <link> oder <img>) schließen.

Dann kannst du bspw. ganz gezielt festlegen, welcher Knoten jetzt geparst werden soll: in dem Fall die Angaben zur Datei:
Code:
      <xsl:apply-templates select="XMLFile"/>
Damit kannst du den HTML-Output beliebig verändern. Ein Pluspunkt bei DOM: egal wo die Knoten im Dokument stehen (ob am Anfang oder Ende), du kannst sagen wann sie berücksichtigt werden sollen.

Jetzt ein bisschen Spielerei . Die XSL-Datei schaut, ob es <Kontakt>-Knoten gibt. Die Bedingungsprüfung "count(child::Kontakt)&gt;0" (&gt; = größer-als = weil > ja auch ein Tag-Zeichen ist) wäre mit dem Delphi-Programm so was wie
Delphi-Quellcode:
nl := xmldoc.selectNodes('/adressdb/Kontakt');
if(nl.length > 0) then ...
Wenn Knoten vorhanden sind, baut er für jeden einen Anker:
Code:
      <xsl:if test="count(child::Kontakt)&gt;0">
       

[b]Direktwahl[/b]:
was in dem Fall mit einer Schleife recht fix geht:
Code:
          <xsl:for-each select="Kontakt">
Als Anker wird der Inhalt der Knoten <Vorname> und <Name> benutzt, sowie die aktuelle Position (falls es doch mal zwei Einträge gleichen Namens gibt)
Code:
            <a href="#{Vorname}_{Name}:{position()}">
              <xsl:value-of select="Vorname"/> <xsl:value-of select="Name"/>
            </a>


          </xsl:for-each>
       
</p><hr size="1"/>
      </xsl:if>
Und dann wird noch mal dafür gesorgt, dass die vorhandenen <Kontakt>-Knoten geparst und damit die Daten angezeigt werden:
Code:
      <xsl:apply-templates select="Kontakt"/>
    </body>
  </html>
</xsl:template>

Du musst also dafür sorgen, dass die XSL-Datei jeden Knoten kennt. Dazu benutzt du einfach das Grundmuster:
Code:
<xsl:template match="Knotenname">
 
</xsl:template>
Ein Sonderfall wären Templates für (ich nenne sie mal) "virtuelle" Knoten, die es im Dokument gar nicht gibt. Da schreibst du
Code:
<xsl:template [color=#ff0000]name[/color]="Knotenname">
 
</xsl:template>
So ein Template kannst du dann an beliebiger Stelle in der XSL-Datei durch
Code:
<xsl:call-template name="Knotenname"/>
aufrufen. Das könntest du bspw. benutzen, um auf der XML-Datei die Navigation deiner HP unterzubringen. Die kommt ja im Dokument nicht vor (nehme ich mal an), also ließe sie sich über so ein Template ergänzen.

Im PSDK findest du dazu einige Beispiele und Erläuterungen.
Wenn du willst, hänge ich dir mal ein paar XML-Dateien von meiner Seite ran. Quasi die Umsetzungen der "doku"-Sparte.
  Mit Zitat antworten Zitat