mmofacts.com

[XSLT] => Javascript Problem

gepostet vor 18 Jahre, 2 Monate von Moogly
Hallo,
folgendes ist mein Problem: Ich habe in meinem XML einen Tag eingebaut, dieser wird mittels XSL und XSLT in ein umgewandelt. Nur mein Problem: sobald ein & in dem JS vorkommt wird ein eingebaut, dies ist zwar XML konform, aber alle Browser haben damit ein Problem, es müssten eigentlich // davor, damits funktioniert.
Hier mal die XML:

new Ajax.Updater('maincontent', 'user_show_map.php?".link_extension."', {asynchronous:true, evalScripts:true});

Die XSL:






Die Ausgabe:

ew Ajax.Updater('maincontent', 'user_show_map.php?game_id=1&sid=blabla', {asynchronous:true, evalScripts:true});
]]>
Hoffe ihr versteht die Problemstellung
Gruß
Moo
gepostet vor 18 Jahre, 2 Monate von Drezil
ich hab zwar nicht so viel ahnung, aber um die (x)html-ausgabe korrekt zu machen muss da eh ein & statt einem & stehen ..
nur frag mich nicht, ob das in einem der anderen schritte rausfliegt ..
gepostet vor 18 Jahre, 2 Monate von Agmemon
Welchen Ausgabemodus hast Du den über xsl: output deklariert? Das er da von selbst einen CDATA Tag einfügt, wundert mich nämlich ein wenig.
gepostet vor 18 Jahre, 2 Monate von knalli
Ja, der sollte vorher schon rausfliegen. XML mag einfache & überhaupt nicht.
Frage: Warum nutzt du als Ausgabe denn überhaupt noch HTML 4, warum kein XHTML? Anders erklärt sich mir nämlich das language-Attribute nicht - "type" gehört darein.
Im Allgemeinen würde ich versuchen, sowenig JavaScript wie möglich zu nutzen.. lieber alles auslagern.
Außerdem: Normalerweise immer alles "xml"-encoden, aber bei Javascript darf man das nicht - dann idealerweise alternative Textcontainer nutzen. hab das jetzt nicht ausprobiert, aber ich würde mal testen, ob in deinem Container "javascript" statt apply-templates nicht ein besser ist..
edit: wobei, das ganze Javascript als CDATA ist doch sogar richtig, wo ist das Problem?
gepostet vor 18 Jahre, 2 Monate von Crafty-Catcher
Das Problem ist das einige Browser Stress machen, da das // fehlt
gepostet vor 18 Jahre, 2 Monate von Moogly
ich habe & stehen, statt &.
Der Ausgabemodus ist xml und die Ausgabe findet nicht in HTML sondern in XHTML statt, ich teste das mit dem Type gleich mal.
Genau, wie Crafty sagt, das fehlende // ist das Problem.
Gruß
Moo
gepostet vor 18 Jahre, 2 Monate von knalli
Original von Moogly
ich habe & stehen, statt &.
Der Ausgabemodus ist xml und die Ausgabe findet nicht in HTML sondern in XHTML statt, ich teste das mit dem Type gleich mal.
Genau, wie Crafty sagt, das fehlende // ist das Problem.
Gruß
Moo

Tja, aber wenn du im Javascript
funktion("datei.php?a=1&b=2")
machst, gibt das kleine Probleme. Javascript ist eben KEIN XML. Deshalb gesonderte Klammerung.
Geht eigentlich nicht eine Gesamtkommentierung mittels xsl:comment?
gepostet vor 18 Jahre, 2 Monate von Moogly
wie genau sehe das dann aus?
Ich habe ein paar "angebliche" Workarounds gefunden, die aber nicht funktionieren.
Gruß
Moo
gepostet vor 18 Jahre, 2 Monate von planetenkiller
also, ich hatte auch gerade das probem. meine lösung:
ich haber extra ein Globales array, in dem die javascipte gesamelt werden.

$GLOBALS['head_new_js'] = '
/*
// code
/*]]>*/
';
dieses array wird nicht ins xml reingenommen, sondern wird in xsl folgende PHP funktion aufgerufen:

function XSL_GetHeaderJS()
{
return implode(" ", $GLOBALS['head_new_js']);
}
im xsl template:

sl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
utput .........../>
.
.
.
.
.
.

Damit funktioniert es bei mir, der code steht richtig im quelltext.
Ich hatte probleme mit dem domdocument, der hatte da die CDATA abschnitte im JS rausgenomen.
gepostet vor 18 Jahre, 2 Monate von knalli
Habe mal geguckt, wie ich das gelöst habe:
Eingabe einfach über Methode("code") (sei intern oder extern, hier egal)

public static function addScriptBlock( $code )
{
$var[] = "";
}
(gekürzte Demodarstellung)
Das Array wird dann einfach simpel in Scriptblöcken aufgebröselt (bei mir sogar mit kleiner Generatorkommentierung) und lässt sich wunderbar nutzen. Allerdings versuche ich soviel JavaScript wie möglich aus dem Dokument zu schaffen.. denn es hat dort eigentlich nichts zu suchen. Manchmal aber gehts einfach nicht anders.
(In der Anwendung definierte ich JS als Zusatzfunktion, nicht Elementarfunktion.)
Dann wird das einfach mittels XML/XSL weiter verarbeitet.. fertig. Da ich noch nicht kompletten Browsertest gemacht habe, weiß ich noch nichts um Fehlverhalten.
gepostet vor 18 Jahre, 2 Monate von Moogly
Habe mich jetzt mal nochmal drangesetzt und versucht eine Lösung auf planetenkiller's Posting aufbauend zu finden, hier die PHP Funktion:

function print_script($script)
{
return implode(" ",$script);
}
?>
Die XSL:




Der XML-String:

/**/
Die Ausgabe:

Object
Mache ich bei der PHP Funktion nur "return $script;" ist die Ausgabe Array.
Warum kommt es zu diesen Ausgaben?
Gruß
Moo
gepostet vor 18 Jahre, 2 Monate von Moogly
Habe die Lösung gefunden!
Thread kann geschlossen werden.
Gruß
Moo
gepostet vor 18 Jahre, 2 Monate von knalli
Original von Moogly
Habe die Lösung gefunden!
Thread kann geschlossen werden.
Gruß
Moo

Sei nicht so kniestig :=)
gepostet vor 18 Jahre, 2 Monate von Moogly
Hier die Lösung:
(XSL




(PHP

function print_script($script)
{
return '
/* .$script.'
/*]]>*/
';
}
Hoffe ich habe die Bedeutung von kniestig jetzt richtig verstanden
Gruß
Moo
gepostet vor 18 Jahre, 2 Monate von knalli
Ja.
Aber das ist im Endeffekt doch genau das gleiche, wie mein Vorschlag; außer, dass du die CDATA einkommentierst hast.
Persönlich hätte ich auch eine Methode bevorzugt, die Serverside/PHP-unabhängig ist. Aber jedem das seine.

Auf diese Diskussion antworten