[XSL/PHP]Includen van geparste XSL

Pagina: 1
Acties:

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Ik heb een biblioteek van JavaScript objecten. Deze staan in een aparte php pagina, en werden altijd geinclude in de pagina waar ze nodig waren omdat ze dan met mod_gzip van Apache 80% verkleind werden.

Nu ben ik het spul aan het ombouwen naar XSL, maar loop ik tegen een probleempje op. Het javascript wordt eerst door de PHP parser gehaald om de browser afhankelijke code serverside te parsen ipv clientside de beslissingen te maken.

Die Javascript code staat nu dus in een XSL bestand welke ik include in een pagina die deze objecten nodig heeft.

Het probleem
De PHP code wordt niet geparsed. Logisch natuurlijk, het bestand wordt direct geinclude, maar ik wil eigenlijk de geparsde code hebben.
Kan dit door die XSL te includen via 'http://'? En waarom niet :P

De vraag
Hoe zorg ik ervoor dat de door PHP geparsde XSL pagina geinclude wordt in m'n XSL bestand?

Mogelijke oplossingen
* De JavaScript code toch clientside parsen
* De JavaScript toch extern laten staan
* De Xsl file via http:// includen, maar dit kan/werkt niet???
* ...

En dan heb ik graag nog meer mogelijkheden waar ik uit kan kiezen... :P

The box said 'requires Windows 95 or better', so I installed Linux...


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
http://www.php.net/manual/en/function.xslt-process.php

Bij het derde voorbeeld worden de xml en xsl direct doorgegeven aan de xslt_process functie. Als je het op die manier doet kun je dus zorgen dat de xsl door php is gegenereerd. Het lijkt me dat dat je probleem oplost.

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Dat is waar, maar:

* dat heeft in principe nix met m'n probleem te maken
* PHP 4.0.6 heeft die functie niet, iig niet met die params

Maar toch bedankt voor het meedenken!

Iemand anders?

The box said 'requires Windows 95 or better', so I installed Linux...


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Dan begrijp ik je probleem niet goed. Kun je proberen het beter uit te leggen?

Ik ga ervan uit dat je de xslt-transformatie server-side doet met xslt_process? Met PHP 4.0.6 is het dan zelfs nog makkelijker dan met PHP 4.1.0, want dan krijg je zoiets:
code:
1
2
3
4
5
6
7
8
9
10
if (...)
{
    (versie x van de javascript aan $xsl toevoegen)
}
else
{
    (versie y van de javascript aan $xsl toevoegen)
}

xslt_process($xsl, $xml, $result);

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Aha, nu begrijp ik wat je bedoelde.

Wat ik wil is het helemaal met xsl laten genereren, dus de include vanuit de
code:
1
<xsl:include href="xsl_gegenereerddoorphp_metjavascript" />

Het externe bestand bevat dus geldige xsl:template declaraties en die templates bevatten JavaScript code. Deze pagina wordt helemaal door php gegenereerd dmv includes van de desbetreffende .js files, die ook weer op *enkele* plekken php code bevatten. Deze php code in de JavaScript code bevat alleen browser controles, en maakt adh hiervan de goeie JavaScript code aan.

Nu is het zo dat de Javascript code goed gegenereerd wordt door php. De Xsl wordt ook prima gegenereerd als ik hem direct via [url="htpp://localhost/bestand.xsl"]htpp://localhost/bestand.xsl[/url] opvraag. Maar als ik hem als file include parsed hij (logisch) de php code niet.

Ik hoop dat het iets duidelijker is zow?

The box said 'requires Windows 95 or better', so I installed Linux...


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Kan dit door die XSL te includen via 'http://'? En waarom niet :P
Bij mij werkt dat wel, inclusief het parsen van de PHP.

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Als ik deze code erin zet
code:
1
<xsl:include href="http://localhost/projects/vega/objects.xsl" />

krijg ik deze foutmelding
code:
1
unsupported URI scheme 'http'

Terwijl hij het met deze code
code:
1
<xsl:include href="objects.xsl" />

wel doet, maar dan parsed hij de php code niet...

The box said 'requires Windows 95 or better', so I installed Linux...


  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
Je kan natuurlijk ook een extra xml bestand maken met de verschillende soorten javascript zut.

Afhankelijk van de originele xml, kan je in de xsl dan de goede code uit die aprate xml includen.

aparte xml
code:
1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<javascripts>
    <javascript browser="IE">
      Hier je javascript zut voor IE
    </javascript>
    <javascript browser="Opera">
      Hier je javascript zut voor Opera
    </javascript>
</javascripts>

De xml die uit je php script komt
code:
1
2
3
4
5
6
<?xml version="1.0"?>
<page>
    <pageInfo>
      <browser>IE</browser>
    </pageInfo>
</page>

De xsl
code:
1
2
3
4
5
6
7
8
9
<!-- al die standaard zut -->
<xsl:variable name="browser"><xsl:value-of select="/page/pageInfo/browser" /></xsl:variable>
<html>
    <head>
      <script type="text/javascript">
        <xsl:value-of select="document('...../javascripts.xml')/javascripts/javascript[@browser = $browser]" />
      </script>
    </head>
</html>

Hopelijk is het een beetje begrijpelijk :)

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Mmm... dat is ook een mogelijkheid ja. Het 'probleem' is alleen dat er in die JavaScript files (het is echt een hele bibliotheek!) Die php code helemaal doorheen zit. E nhoe krijg ik op die manier de browser info van de client om die te gebruiken in m'n xsl?

The box said 'requires Windows 95 or better', so I installed Linux...


  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
wat j zou kunnen doen is proberen de javascripts vanuit de xsl via http oproepen en dat een php bestand oproepen die de xml maakt met de dynamische javascripts.

Waarschijnlijk zal de performance echter vrij slecht zijn in dat geval.

Ik zie trouwens dat je er zelf ook al mee aan het testen mee bent geweest, maar je include toen een .xsl bestand met een zooi php code. Apache zal nooit weten dat ie dat bestand door php heen moet halen, voordat ie het output. daar zijn 2 oplossingen voor:
  • Apache duidelijk maken dat ie .xsl bestanden ook moet parsen met php. het nadeel hiervan is, dat dus elk .xsl bestand op de server door php geparsed moet worden. Als er geen stukje php code in het bestand staat, kost dat dus onnodig veel tijd, omdat php er toch mee aan de slag gaat.<li>Je dynmische xsl gewoon als .php bestand opslaan. Hierdoor weet Apache direct dat ie eerst door php geparsed moet worden voor ie verstuurd wordt. Nadeel hiervan is, dat het de duidelijkheid van de bestandanamen niet ten goede komt.
</li>

  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Klopt, dat had ik al meteen gedaan ja. Ik heb een .htaccess bestandje neergezet die zegt dat die .xsl door de PHP parser geparsed meot worden. Dat werk allemaal prima, maar ik kan geen linkje opgeven dattie het bestand include via http://. Waarom het werkt weet ik niet, maar het werkt iig niet.

The box said 'requires Windows 95 or better', so I installed Linux...


  • TheMrH
  • Registratie: April 2000
  • Laatst online: 01-09 22:45
Zow! Het is me gelukt!!!! Wat ik dus moest doen was een schem handler aanmaken voor de http scheme. Deze kent Sablotron klaarschijnlijk niet, dus openen we zelf het bestand en retourneren het document....
PHP:
1
<?xslt_set_scheme_handlers($this->processor, array('get_all' => array(&amp;$this, 'schemeHandler')));?>

Die &$this moet dus om dat de callback functie in de class zit. De callback functie zelf is deze:
PHP:
1
<?    function schemeHandler($xslt_handler, $scheme, $resource)    {        if ('http' == $scheme            || 'ftp' == $scheme)        {            $uri = $scheme.':'.$resource;            if($doc = new docReader($uri))            {                return $doc->getString();            }        }    }?>

Op deze manier kan je dus van vele bronnen een xsl of xml bestand halen, als je de uri maar kan inlezen. I kzie meerdere mogelijkheden..... Zelf heb ik ftp er ook maar meteen ingeplakt.

Ik hoop dat meerdere mensen hier wat aan hebben....

The box said 'requires Windows 95 or better', so I installed Linux...


  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 09-08 19:19
ah, dat wouden ze me uitleggen met die scheme handlers :)
Pagina: 1