XML-Datei mit verschiedenen XSL-Ausgabe-Dateien
Patrick Fischer
- xml
Guten Tag, werte Community.
ich befasse mich nun seit gestern sehr mit xml+xsl, denke wohl das ich da nun durchblicke und hab deshalb versucht es mal anzuwenden und klappte auch. Ich bin davon sehr beeindruckt. Doch stehe nun vor einem Problem, das ich in der Überschrift schon erwähnte, ich aber nochmal zum besseren Verständnis in komplette Sätze packen möchte.
Was ich habe
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE tabelle SYSTEM "../scripts/tab.dtd">
<?xml-stylesheet type="text/xsl" href="../scripts/tab.xsl" ?>
<gesamt>
....
</gesamt>
Was ich möchte / das Problem:
Eine andere Idee wäre eine xsl-datei zu nehmen und darin ne Fallunterscheidung vorzunehmen, aber das Problem bleibt, wie unterscheide ich dich?
Ich habe schon probiert ne xml-datei über php zu erzeugen, also hab ich den Inhalt der tab1.xml in ne php-datei geschmissen und nen echo drumgebastelt, geht leider nicht, der Text wird unformiert ausgegeben.
Die Idee ging in die Richtung durch nen php-script die Verweiszeile auf die xsl schreiben zu lassen.
Ich danke jedem, der mir versucht zu helfen.
Patrick,
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE tabelle SYSTEM "../scripts/tab.dtd">
Da steht "tabelle" ...
<?xml-stylesheet type="text/xsl" href="../scripts/tab.xsl" ?>
<gesamt>
... und hier "gesamt"?
Der Name des Dokumenttyps muss mit dem Namens des Dokument-Elements, also dem äußersten Element in der XML Datei, identisch sein. (http://de.selfhtml.org/xml/regeln/dokumenttypdeklaration.htm#interne_dtd)
Gunnar
Hallo,
- xml-dateien (tab1.xml und tab2.xml), die so aufgebaut:
<!DOCTYPE tabelle SYSTEM "../scripts/tab.dtd">
<?xml-stylesheet type="text/xsl" href="../scripts/tab.xsl" ?>
<gesamt>
....
</gesamt>
Dazu wurde schon was gesagt.
Was ich möchte / das Problem:
- Ich möchte die xml-dateien aber auf zwei verschiedene Arten ausgeben, einmal für normale User und einmal für Admins, also (meine Überlegung) müsste ich zwei xsl-dateien definieren, eine hab ich ja schon, die tab.xsl, also bräuchte ich noch ne adtab.xsl. Wie kann ich aber nun beim Aufruf der tab1.xml bzw tab2.xml dem Browser begreiflich machen, welche xsl er verwenden soll?
Eine andere Idee wäre eine xsl-datei zu nehmen und darin ne Fallunterscheidung vorzunehmen, aber das Problem bleibt, wie unterscheide ich dich?
Du hast dabei zwei Möglichkeiten:
a) falls du dein XML/XSL-Transformation serverseitig machst (PHP lässt darauf schließen)
Da brauchst du die Zeile "<?xml-stylesheet type="text/xsl" href="../scripts/tab.xsl" ?>" in deiem XML nicht unbedingt. Du kannst stattdessen den Namen der XSL-Datei als URL-Parameter an einem PHP-Script übergeben und dieses führt dann die entsprechende Transformation aus.
Beispiele findest du in den entsprechenden Seiten der PHP-Dokumentation oder im Archiv hier.
Die alternative: du brauchst nur eine XSL-Datei und wie du es vermutet hast, kannst du einen Parameter beim aufruf des PHP-Scripts übergeben, diesen Parameter wertest du in deinem XSL aus und dementsprechend wird ein anderer Zweig in deinem XSL ausgeführt.
Beispiele findest du in den entsprechenden Seiten der PHP-Dokumentation oder im Archiv hier.
b) du willst die XML/XSL-Transformation dem Browser überlassen (geht nur im IE, Mozilla, Firefox).
Dabei kannst du die Transformation aus einer HTML-Datei heraus per JavaScript anstoßen und du kannst dabei auch einen Parameter übergeben, diesen in deinem XSL auswerten ... den Rest kennst du schon.
Beispiele dazu findest du im Archiv von mir oder von Thomas Meinike.
Grüße
Thomas
PS: notiz an mich ... ich muss schläunigst die Artikel zu diesem Thema fertigschreiben ....
Hallo Thomas,
ich spreche dich mal direkt an, weil du mit dem anderen Thomas ja scheinbar die meiste Ahnung von der Materie hast, es kann aber auch jeder andere antworten, der mir helfen kann.
Ansich hatte ich schon nen ganz anderen ellenlangen Text getippt, den ich mir aber spare, weil das Thema ja schon ein paar mal diskutiert wurde.
zum einen hier:
http://forum.de.selfhtml.org/archiv/2003/3/t42624/#m232979
aber auch einigen anderen Seiten, die halt irgendwo in dem Archiv verlinkt wurden.
Den ersten Hinweis mit den Namen hab ich angenommen.
Meine einzigstes Frage bzw mein Problem besteht darin:
Wie bekomme ich von einem Link tab1.xml?admin=yes diese Variable in die xsl-datei?
Die Übergabe soll client-seitig erfolgen und verarbeiten werden. Also wenn möglich über JavaScript, PHP wäre auch möglich, wenn server-seitig einfacher ist.
Mein Verständnisproblem besteht darin, dass ich die Variable ja an die xml-datei übergebe, darin damit aber nix anfangen kann, xml ist ja nur eine Sprache zur Erfassung einer Datenstruktur, also sollte es da doch kaum möglich, ne Variable abzufangen und an die xsl weiter zugeben, so wie: <?xml-stylesheet type="text/xsl" href="../scripts/tab.xsl?admin=yes" ?> .
Oder ist es möglich, in einer xml-datei xsl-code oder gar nen java-script auszuführen?
Hallo,
Mein Verständnisproblem besteht darin, dass ich die Variable ja an die xml-datei übergebe, darin damit aber nix anfangen kann, xml ist ja nur eine Sprache zur Erfassung einer Datenstruktur, also sollte es da doch kaum möglich, ne Variable abzufangen und an die xsl weiter zugeben, so wie: <?xml-stylesheet type="text/xsl" href="../scripts/tab.xsl?admin=yes" ?
Uebergib den Parameter an das XSL-Stylesheet, die XSLT-Prozessoren bieten dafuer ueblicherweise [Kommandozeilen-]Optionen an.
Beispiel:
mini.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<bla>
<blub>123</blub>
</bla>
mini.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="blablub"/><!-- definiert den zu uebernehmenden Parameter -->
<xsl:template match="/">
<html><head><title>Test by TM 12/04</title></head><body>
<p><xsl:value-of select="bla/blub"/><xsl:value-of select="$blablub"/></p>
</body></html>
</xsl:template>
</xsl:stylesheet>
Mit dem von mir gern verwendeten XMLStarlet funktioniert die Transformation mit Parameter[n] so:
xml tr mini.xsl -s blablub=456 mini.xml > mini.htm
Das relevante Ergebnis lautet: ...<p>123456</p>...
wobei 123 aus dem blub-Element stammt und 456 der blablub-Parameterwert ist.
Beispiele fuer Client-seitige Transformationen mit JS finden sich im Archiv.
MfG, Thomas
Danke Thomas, und danke auch dir Thomas *g*
Ihr seht ich bin gutgelaunt.
Zum einen deshalb, weil ich ein geiles Hallenturnier in Riesa hinter mir habe, zum andern, weil mir jetzt eben, spät in der Nacht, eine Lösung für mein Problem eingefallen ist, die euch sicher auch interessiert. Dennoch muss ich sagen, dass ich sie noch nicht getestet/gecodet habe (ist mir dafür zu spät).
Mein Szenario:
Ich habe eine html/php-hauptseite mit einem Menü und einem (i-)frame-bereich. wenn man auf einem der Menüpunkte klickt, soll eine xml-datei in dem (i-)frame ausgegeben werden, die mit einer user-xsl formatiert wird. Gleichzeitig will ich als Admin auf die xml-datei zugreifen können, aber halt mit einer anderen admin-xsl-datei, die mir über input-felder den inhalt ändern lässt.
Mein Problem:
Wie ruft man ein xml-file mit verschiedenen xsl's auf? Wir kamen zu der Idee man müsste ne Variable übergeben, die der xml klarmacht, welche xsl-datei verwendet werden soll.
[Die Variante mit einer xsl-datei und verschiedenen templates klammere ich mal aus]
Mein Lösungsvorschlag:
Anstatt mit den Menüpunkten eine xml-datei aufzurufen, führen alle Verweise auf ein php-file. Dabei werden 2Variablen übergeben, eine die den, ich nenns mal Actor, bestimmt und eine für die xml-datei.
Ein Verweis im Menü sehe dann so aus: href="xml.php?admin=no&datei=xml1.xml"
Was macht nun diese xml.php?
Sie fängt die beiden Variablen natürlich am Anfang gleich ab.
Es folgt ein php-teil, der eine verbindung zu der übermittelten xml-datei herstellt. Irgendwie, womöglich nen Pointer, gehe ich an die Stelle in der xml-datei, wo der xsl-verweis definiert ist. Diese Zeile lass ich von dem php-script neu schreiben und zwar mit einer Zeile, die mittels Fallunterscheidung in Abhängigkeit der admin-variable festgelegt wurde. Damit enthält die xml-datei immer den richtigen Verweis auf die gerade benötigte xsl.
Nun folgt astreiner html-code mit ner Sofortweiterleitung auf die besagte xml-datei.
Nun seid ihr gefragt, eure Meinung dazu abzugeben.
Ein Problem, das ich mir vorstellen könnte, wären die ständigen Schreibzugriffe auf die xml-datei. Vielleicht gibts ja ne Möglichkeit, die Datei nur virtuell zu ändern.
Hallo,
Es folgt ein php-teil, der eine verbindung zu der übermittelten xml-datei herstellt. Irgendwie, womöglich nen Pointer, gehe ich an die Stelle in der xml-datei, wo der xsl-verweis definiert ist. Diese Zeile lass ich von dem php-script neu schreiben und zwar mit einer Zeile, die mittels Fallunterscheidung in Abhängigkeit der admin-variable festgelegt wurde. Damit enthält die xml-datei immer den richtigen Verweis auf die gerade benötigte xsl.
Wenn PHP verwendet wird, dann ist es doch praktikabler, die Transformation gleich auf dem Server auszufuehren und nur das HTML-Ergebnis auszugeben.
Das kann man natuerlich auch mit Variablen beliebig steuern.
Als Anregung: Bei meinem Tourdaten-Beispiel (XML) zu einem Artikel aus 2002 kommen je ein XSL-Stylesheet fuer die Auswahl bzw. Ausgabe zur Anwendung. Die Parameteruebergabe von Auswahl zu Ausgabe wurde dabei mittels Include-Stylesheet realisiert, welches nach erfolgter Auswahl mit PHP erzeugt wird (und neben dem Bandnamen das aktuelle Datum an das Ausgabe-Stylesheet sendet).
MfG, Thomas
Hallo Patrick,
Wie bekomme ich von einem Link tab1.xml?admin=yes diese Variable in die xsl-datei?
Die Übergabe soll client-seitig erfolgen und verarbeiten werden. Also wenn möglich über JavaScript,[...]
Mein Verständnisproblem besteht darin, dass ich die Variable ja an die xml-datei übergebe, darin damit aber nix anfangen kann, xml ist ja nur eine Sprache zur Erfassung einer Datenstruktur, also sollte es da doch kaum möglich, ne Variable abzufangen und an die xsl weiter zugeben, so wie: <?xml-stylesheet type="text/xsl" href="../scripts/tab.xsl?admin=yes" ?> .
Oder ist es möglich, in einer xml-datei xsl-code oder gar nen java-script auszuführen?
Nein, das ist nicht möglich.
Wenn du es auf der Clientseite machen möchtest (also mit JavaScript) muss du aus einer HTML-Datei heraus die Transformation mit dem Parameter aufrufen.
Unter http://forum.de.selfhtml.org/archiv/2004/4/78019/#m451662 findest du ein komplettes Beispiel (mit XML-, XSL- und HTML-Datei).
Ich hoffe du kommst damit weiter. (Serverseitig wärst du aber etwas sicherer d.h. nicht auf IE/Mozilla beschränkt)
Grüße
Thomas