[Php,Xml,Xsl] Character Encoding e.d.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • seweso
  • Registratie: Augustus 2003
  • Laatst online: 04-04-2018

seweso

de mouw is uit de aap

Topicstarter
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).


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

seweso's blog


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Input is not proper UTF-8.
:?

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Stuurt de client zelf de encoding mee terug misschien ?
(ik weet niet of dat zo is, probeer alleen maar mee te denken)

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Ik gebruik zelf ook vaak XSLT in PHP-projecten (maar dan onder PHP 4), en ik heb nog de volgende lijn in mijn XSLT staan:

code:
1
<xsl:output method="xml" indent="yes" encoding="ISO-8859-1" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />

(maar ik heb een <xsl:transform> als root, jij hebt <xsl:stylesheet>)

Verder mag je volgens mij sowieso niet é meegeven als GET, maar moet je urlencode("é") meegeven. Dus dat zou ik ook eens proberen.

[ Voor 27% gewijzigd door djc op 09-10-2004 12:17 ]

Rustacean


Acties:
  • 0 Henk 'm!

  • seweso
  • Registratie: Augustus 2003
  • Laatst online: 04-04-2018

seweso

de mouw is uit de aap

Topicstarter
Je oplossing werkte niet....maar ik heb het zelf al gevonden. Ik converteer nu de xml uitvoer van XML_Serializer met de utf8_encode functie.

seweso's blog


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
fijn dat je de oplossing gevonden hebt, maar ik ben het niet met je eens wat betreft de gefragmenteerdheid van de XML support in PHP5:

• SimpleXML is wanneer je geen gebruik maakt van libxml2
• ext/DOM is wanneer je wel gebruik maakt van libxml2
• ext/XSL is gebasseerd op libxslt, welke gekoppeld is aan libxml2

Sablotron zal wel werken maar is een relikwie uit de PHP4 tijd. Dus ik zie de moeilijkheid er eigenlijk niet echt van in...

Zelf probeerde ik "vroeger" nog zoveel mogelijk met XSLT te doen, maar nu er goede DOM support in PHP zit, merk ik dat ik XSLT steeds minder gebruik. Ook gebruik ik, als het enigszins mogelijk is, XHTML om gegevens op te slaan (of direct naartoe te converteren vanuit een database). Dat scheelt een hoop XSLT gerommel.
Pagina: 1