Ik word gillend gek van Php, ik ben al maanden bezig met het zoeken naar dé manier om met xml te werken. Op php.net word Xsl aanbevolen voor Xslt transformaties, SimpleXml om xml te parsen en Dom om Xml te maken? Men kan veel zeggen over Microsoft maar ik vind MSXML toch echt wel een stuk handiger werken dan 3 losse systemen. Maar daar kan ik op zich wel overeenkomen als ik met wat extra moeite de boel uberhaupt aan de praat krijg want ik blijf nu op character encoding steken. Oftewel als er een verkeerd karakter aan de xslt processor word geleverd dan krijg ik een foutmelding.
En ja ik weet dat daar hier reeds topics over zijn, maar een echte oplossing voor mijn probleem heb ik nog niet gevonden (waarom ben ik er anders al zo lang mee bezig?).
Wat ik concreet moet kunnen is data die door een gebruiker is ingevoerd omzetten naar xml en via xslt omvormen naar (x)html. De client-side transformatie werkt perfect, zowel in Internet Explorer als Firefox. Maar bij de xslt transformatie op de server gaat het mis.
Ik draai PHP 5.01 (op Apache 2.0) op Linux (Fedora core 1), met xslt (Sablotron 1.0.1) los geinstalleerd. Dat laatste is vreemd omdat xslt support standaard aan zou moeten staan in php 5 én omdat ik aan de systeembeheerder de XSL extensie heb gevraagd en niet Sablotron... (ze zouden bij php daar goede namen voor moeten verzinnen want dit is echt heel erg verwarrend allemaal).
test_xsl.xsl:
Als je nu de php aanroept met de querystring ?aap=é dan krijg je de foutmelding Warning: DOMDocument::loadXML() [function.loadXML]: Input is not proper UTF-8, indicate encoding ! in Entity, line: 4 in /home/wst/html/test/test_xsl.php on line 22
(als je geen Pear hebt of geen zin hebt om deze te installeren kun je ook gewoon de eerste 4 regels vervangen door $xml = "<array><aap>é</aap></array>"; )
Ik heb zelf al de xml header aangepast (van de xml die aan DomDocument word doorgegeven) zodat deze ISO-8859-1 of UTF-16 aangeeft maar daar valt hij ook over. Ik krijg sterk het gevoel dat Php meer gericht is op het parsen van xml dan het genereren van xml.
Als beloning voor een oplossing heb ik nog wel wat gmail-invites
En ja ik weet dat daar hier reeds topics over zijn, maar een echte oplossing voor mijn probleem heb ik nog niet gevonden (waarom ben ik er anders al zo lang mee bezig?).
Wat ik concreet moet kunnen is data die door een gebruiker is ingevoerd omzetten naar xml en via xslt omvormen naar (x)html. De client-side transformatie werkt perfect, zowel in Internet Explorer als Firefox. Maar bij de xslt transformatie op de server gaat het mis.
Ik draai PHP 5.01 (op Apache 2.0) op Linux (Fedora core 1), met xslt (Sablotron 1.0.1) los geinstalleerd. Dat laatste is vreemd omdat xslt support standaard aan zou moeten staan in php 5 én omdat ik aan de systeembeheerder de XSL extensie heb gevraagd en niet Sablotron... (ze zouden bij php daar goede namen voor moeten verzinnen want dit is echt heel erg verwarrend allemaal).
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| <?php // Ik gebruik de serializer van Pear om xml te genereren require_once("Pear/Serializer.php"); $serializer = new XML_Serializer($options); // Gebruik de array $_GET als voorbeeld data $result = $serializer->serialize($_GET); $xml = $serializer->getSerializedData(); $xslfile = "test_xsl.xsl"; // Volgende 4 regels zijn voor client-side transformatie (dat werkt dus wel) /* header("Content-type: application/xml; charset=iso-8859-1"); echo "<?xml version=\"1.0\"?>\n"; echo "<?xml-stylesheet type='text/xsl' href='$xslfile'?>\n"; die($xml); //*/ $xslt = new XsltProcessor(); $xslt->importStyleSheet(DomDocument::load($xslfile)); $result = $xslt->transformToXML(DomDocument::loadXML($xml)); //header("Content-Type: text/html; charset=iso-8859-1"); echo $result; ?> |
test_xsl.xsl:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| <?xml version="1.0" encoding="ISO-8859-1" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="array"> <html> <body> Test_xsl.xsl genereert:<br/> <xsl:for-each select="*"> <xsl:value-of select="name()"/> = <xsl:value-of select="."/><br/> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet> |
Als je nu de php aanroept met de querystring ?aap=é dan krijg je de foutmelding Warning: DOMDocument::loadXML() [function.loadXML]: Input is not proper UTF-8, indicate encoding ! in Entity, line: 4 in /home/wst/html/test/test_xsl.php on line 22
(als je geen Pear hebt of geen zin hebt om deze te installeren kun je ook gewoon de eerste 4 regels vervangen door $xml = "<array><aap>é</aap></array>"; )
Ik heb zelf al de xml header aangepast (van de xml die aan DomDocument word doorgegeven) zodat deze ISO-8859-1 of UTF-16 aangeeft maar daar valt hij ook over. Ik krijg sterk het gevoel dat Php meer gericht is op het parsen van xml dan het genereren van xml.
Als beloning voor een oplossing heb ik nog wel wat gmail-invites