URL: https://www.overclockers.at/coding-stuff/newbie-fragen_zu_xslt_109814/page_1 - zur Vollversion wechseln!
Ich spiele mich gerade mit XSLT herum. Tutorials habe ich zur Hand, nur komme ich trotzdem nicht ganz weiter (und ich will auch nicht vorgeben alles zu verstehen ...).
Jedenfalls. XML sieht so aus:
Es werden unter /root/a/b/ zuerst wie in einem hash keys und values definiert.Code:<root> <a> <b> <!-- Quasi alle Elemente flat aufgezehlt, wie Hash --> <key>text..</key> <value>text...</value> <key>text..</key> <value>text...</value> </b> <!-- ab hier dann angabe der verschachtelung der obrigen keys --> <a> <key>text...</key> <a> <key>text...</key> <key>text...</key> </a> </a> <a> <key>text...</key> <a> <key>text...</key> <key>text...</key> <key>text...</key> </a> </a> </a> </root>
OK wo ist jetzt die Frage?
JajaZitat von thatOK wo ist jetzt die Frage?
Aus der Beschreibung kann ich leider nicht genau genug ableiten, was du vor hast. Hast du ein konkretes Input-Dokument und ein Muster, wie du dir die Ausgabe vorstellst?
Lösungsansätze könnten Templates mit verschiedenen Modes sein (einmal fürs Inhaltsverzeichnis und einmal für den Inhalt selbst), sowie die Nutzung von following-sibling für die Inhalte.
Sind die Keys eh eindeutig? Gibt es garantiert nur ein <b> Element?
Following-sibling klingt schon mal gut. Koenntest du mir ein Beispiel-Template schreiben wie ich das verwenden wuerde um nur den zweiten Teil (ab dem zweiten Kommentar) des Dokumentes zu bearbeiten?
Keys sind eindeutig, ja. D.h. ein Key der oben definiert ist, ist unten auch vorhanden, 1:1-Beziehung.
Zitat von RektalFollowing-sibling klingt schon mal gut. Koenntest du mir ein Beispiel-Template schreiben wie ich das verwenden wuerde
Wobei es nicht zufaellig ist, das das 'a' direkt unter Root auch als Nachfolger nach dem '</b>' zu finden ist.Code:<?xml version="1.0" encoding="UTF-8"?> <root> <a> <b> <key>key 1</key> <value>value 1</value> <key>key 2</key> <value>value 2</value> </b> <a> <key>key 1</key> <a> <key>key 2</key> </a> </a> </a> </root>
Ich hab da mal schnell was zusammengeschustert...
Code:<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/> <xsl:template match="/"> <html> <head> <title>bla</title> </head> <body> <xsl:apply-templates select="/root/a/*[not(ancestor-or-self::b)]" mode="toc"/> <hr/> <xsl:apply-templates select="/root/a/b" mode="body"/> </body> </html> </xsl:template> <xsl:template match="a" mode="toc"> <h3><xsl:value-of select="text()"/></h3> <ul> <xsl:apply-templates mode="toc"/> </ul> </xsl:template> <xsl:template match="key" mode="toc"> <li><a href="#{text()}"><xsl:value-of select="text()"/></a></li> </xsl:template> <xsl:template match="key" mode="body"> <a name="{text()}"/> <h3><xsl:value-of select="text()"/></h3> <p> <xsl:value-of select="following-sibling::text()"/> </p> </xsl:template> </xsl:stylesheet>
So ein Schuster moecht' ich auch sein ...
Ganz funktioniert hats bei mir nicht, aber ich habs weiterbearbeitet und dann zum gewuenschten Ergebnis gebracht.
Folgendes ging nicht:
- der Inhalt von <p></p> war immer leer
- dafuer wurde danach der Inhalt der value-Nodes ausgegeben
Mein fix:
- value-of-Expression auf select="following-sibling::value[position()=1]" abgeaendert, da laut http://www.w3.org/TR/xpath "following-sibling" mehrere Nodes und nicht eine einzelne zurueckgibt
- ein Dummy-Template gebaucht, das die noch nicht verarbeiteten value-Nodes "erledigt", quasi ohne Ausgabe: <xsl:template match="value" mode="body"/>
Thx auf alle Faelle, hat mir schwer geholfen einen besseren Einblick zu bekommen.
Wenn mir vielleicht noch jemand sagen kann, warum die value-Nodes doppelt ausgegeben werden, obwohl sie ja im Template <xsl:template match="key" mode="body"> verarbeitet werden (vermutlich "gilt" das nicht fuer die value-Nodes und desshalb die Ausgabe?).
Gibts fuer das Thema bevorzugte Buecherempfehlungen? Hab mal auf Amazon geblickt, deutschsprachig eher keine Auswahl da alle zu sehr Sprachenorientiert (Java), englische gibts folgende:
http://www.amazon.de/exec/obidos/AS...8530378-6326937
http://www.amazon.de/exec/obidos/AS...8530378-6326937
http://www.amazon.de/exec/obidos/AS...8530378-6326937
Zitat von RektalWenn mir vielleicht noch jemand sagen kann, warum die value-Nodes doppelt ausgegeben werden, obwohl sie ja im Template <xsl:template match="key" mode="body"> verarbeitet werden (vermutlich "gilt" das nicht fuer die value-Nodes und desshalb die Ausgabe?).
Ich habe zu XSLT nie ein Buch gelesen. Die ersten Schritte habe ich vor ca. 4 Jahren mit irgendeinem Web-Tutorial gemacht, und alles weitere mit den W3C TRs und der XSLT FAQ:
http://www.dpawson.co.uk/xsl/sect2/sect21.html
Und dieses QuickRef-Blatt drucke ich mir alle paar Monate aus und verwende es, bis es bei irgendeinem Kollegen oder in meinem Chaos verschwindet:
http://www.mulberrytech.com/quickref/index.html
Also so gelernt wie's heutzutage sein sollte Vier Jahre is lang. Hast du seit dem immer wieder damit gearbeitet?
Immer wieder, aber nicht ständig.
Meine erste Anwendung war XSLT als Template-Mechanismus für Webseiten.
Weitere Anwendungen:
- Sourcecode aus Datenmodellen und in XML umgewandelten Datenstrukturen generieren
- Dokumentationen im HTML-Format aus diesen XMLs generieren
- div. Reports aus XML-Dateien (wieder HTML)
- XML an neue Version von DTD/Schema anpassen (sowas wie "dieses Attribut ist in Zukunft ein Element")
- Zusammenführen mehrerer XMLs zu einem (praktisch ein XML-Join)
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025