Pages :
J'ai réalisé un document XML ainsi que le document XSL qui lui est associé. L'affichage de ce document dans un navigateur comme firefox se passe sans problèmes...

Toutefois, j'ai besoin d'introduire dans le document XLS des variables PHP, j'ai donc voulu utilisé xlst_process (http://bob.developpez.com/phpxslt/) mais là une erreur se produit lors de l'appel à la fonction xslt_process() : not well-formed (invalid token) et le code d'erreur est 2 Smiley decu

D'après l'erreur, j'en déduis que mon document xml est mal formé, mais je comprends pas trop pourquoi cela ne posait aucun problème avant... je suppose que la validation avec xslt_process est donc plus rigoureuse ...

Voici le document xml en question :

http://cilma.mathieu-jobard.info/cours/GIML/assembleur.xml

Que dois-je faire pour produire un document XML que sera accepté par xlst_process() ?

Merci d'avance pour vos réponses Smiley biggrin
Modifié par m@t (25 Feb 2006 - 14:15)
Bonjour,

As tu vérifié que les caractères utilisés et l'encodage étaient compatibles entre eux et compris de ton processeur XSL ?

Par ailleurs l'article auquel tu fais allusion sur developpez.com est ancien. Aujourd'hui l'API utilisant sablotron n'est plus maintenue dans PHP, et par ailleurs j'ai souvent lu que l'ensemble (API + processeur) posait de nombreux problème (bugs dont je ne sais s'ils proviennent de sablotron ou de l'interface). J'ai constaté de mon coté que les performances de sablotron n’étaient pas au rendez-vous.

Actuellement le projet PHP préconise ouvertement l'utilisation des librairies libxml2 et libxslt. Il s'agit en PHP4 des API DOM-XSL et DOM-XML, et en PHP5 de l'API XSL.
Modifié par Xavier (11 Feb 2006 - 17:48)
Ok merci pour ta réponse .. je vais essayer de me documenter sur ces nouvelles méthodes alors Smiley smile

Toutefois, si vous avez des liens je suis preneur Smiley smile
Bon ben j'arrive à rien ... et surtout ce qui m'embête c'est quand cherchant sur Internet des exemples d'implémentations de cette méthode, ils sont quasiment tous différents ... et évidement je n'arrive à en faire fonctionner aucun... Smiley decu

Voilà le code (posté par toi dans un autre topic) que j'utilise :


$DomXmlFile = DOMDocument::load($file);

$DomXslTrans = DOMDocument::load('./styles/PJEML.xsl');

//création du processeur xslt

$proc = new XSLTProcessor;

//le processeur xslt dispose de la transformation xslt			

$proc->importStyleSheet($DomXslTrans);

// le résultat de la transformation XSLT envoyé au client

print $proc->transformToXML($DomXmlFile);	



Voilà l'erreur renvoyé :

Fatal error: Call to undefined function: load() in /homepages/12/d141864718/htdocs/cilma/filtre.php on line 13


Bon je me suis dit que je n'avais certainement pas la bonne extension d'installé, mais pourtant après avoir fait un phpinfo() pour m'en assurer, j'ai l'air d'avoir l'API nécessaire ... aussi bien en local que sur mon serveur (j'ai essayé sur les deux)...

Voilà la partie concernant DOMXML :

domxml
DOM/XML 	enabled
DOM/XML API Version 	20020815
libxml Version 	20611
HTML Support 	enabled
XPath Support 	enabled
XPointer Support 	enabled
DOM/XSLT 	enabled
libxslt Version 	1.1.7
libxslt compiled against libxml Version 	2.6.11


Après pas mal d'essais... je n'ai toujours rien pu afficher ... Smiley decu
Modifié par m@t (12 Feb 2006 - 17:26)
Finalement, j'arrive à un résultat avec ce code :


$xmldoc = domxml_open_file("algebre.xml");
$xsldoc  = domxml_xslt_stylesheet_file ("PJEML.xsl");
$result  = $xsldoc->process($xmldoc);
print $result->dump_mem();


Toutefois, plus aucun de mes accents ne passent, ni les entités représentant des symboles mathématiques que j'utilisais comme ∈ ε , etc Je suppose que pour ce qui est des accents il faudrait que j'utilise l'encodage utf-8 .. c'est ce que j'ai essayé de faire .. mais là plus aucun résultat, cela me renvoe une erreur php ... Si quelqu'un a une idée ?

Pour ce qui est des symboles mathématiques ... il ya bien MathML ... mais même en ayant cherché un peu je ne vois pas trop comment l'utiliser simplement ... Smiley decu

Il y aussi un rendu beaucoup moins joli qu'avant (le sommaire au début n'est plus exact) mais je pense que cela devrait pouvoir être améliorer avec le xsl et css ...

Merci d'avance pour votre aide Smiley smile
Le code que j'ai donné correspondait à l'API XSL de PHP5. Tu es visiblement en PHP4, et le code que tu utilises convient.

Pour ce qui est des accents utilise encoding="ISO-8859-1"

J'ai un exemple d'utilisation de MathML.
Ce qui est étrange ce que j'utilise déjà ce format d'encodage (ISO-8859-1) ... et c'est l'encodage que m'indique le navigateur dans Affichage -> Encodage des caractères .. pourtant tous les accents sont supprimés et remplacés par des caractères non souhaités Smiley decu Donc je ne vois pas trop Smiley decu

J'étais déjà tomber sur ta page, je vais regarder cela de plus près Smiley smile

En tout cas merci Smiley smile
Merci pour ta réponse Smiley smile

J'ai réussi à résoudre tous les problèmes excepté celui de l'encodage de mon document (tous les accents sont remplacés par des caractères oléolé) et de MathML... Smiley decu

Mes documents sont déclarés en encoding="ISO-8859-1" ...

Voici la déclaration de mon document XML ainsi qu'un bout de code utilisant MathML :


<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd" [<!ENTITY mathml "http://www.w3.org/1998/Math/MathML">]>

<math xmlns="&mathml;">
 <msub>
  <mi>a</mi>
  <mn>0</mn>
 </msub>
 <mo>+</mo>
 <mfrac>
  <mn>1</mn>
  <mrow>
   <msub>
    <mi>a</mi>
    <mn>1</mn>
   </msub>
   <mo>+</mo>
   <mfrac>
    <mn>1</mn>
    <mrow>
     <msub>
      <mi>a</mi>
      <mn>2</mn>
     </msub>
     <mo>+</mo>
     <mfrac>
      <mn>1</mn>
      <mrow>
       <msub>
        <mi>a</mi>
        <mn>3</mn>
       </msub>
       <mo>+</mo>
        <mfrac>
         <mn>1</mn>
         <mrow>
          <msub>
           <mi>a</mi>
           <mn>4</mn>
          </msub> 
         </mrow> 
        </mfrac>
       </mrow>
      </mfrac>
     </mrow>
    </mfrac>
   </mrow>
 </mfrac>
</math>


La déclaration du fichier xsl:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">


Je cherche toujours Smiley decu
Pour les accents j'ai résolu le problème comme suit:

print utf8_decode($result->dump_mem());


Je ne sais pas trop si c'est la bonne solution, toujours est-il que cela fonctionne Smiley smile

Pour ce qui est de MathML, j'arrive à l'utiliser dans des petits fichiers exemples mais pas dans mon fichier xml d'origine ...

Je suis en train de regarder du côté du type MIME

Sinon j'ai aussi un gros problème ... cela ne fonctionne pas sous IE ... cela ne renvoie aucune erreur mais aucune donnée n'est affichée ... pourtant si l'on fait Voir la source ... elle est bien présente ... là je sèche Smiley decu
Modifié par m@t (13 Feb 2006 - 11:24)
Pour ce qui est du problème avec IE, cela vient de l'inclusion d'un fichier javascript...

<script language="Javascript" type="text/javascript" src="./javascript/functionsCours.js">


Sous firefox, si je procède comme ça dans le fichier xsl (tout fonctionne) :

Sous IE, aucune donnée n'est affichée

Autre façon de faire :


<xsl:comment>
<![CDATA[
<script language="Javascript" type="text/javascript" src="./javascript/functionsCours.js"></script>
]]>
</xsl:comment>


Là sous Firefox, le fichier javascript n'est "plus inclus" donc je me retourve avec des erreurs Javascript...

Sous IE, les données sont affichées mais j'ai également des erreurs javascript ...

Que faire ??
Smiley sweatdrop
Je suis un peu perdu dans tous tes problèmes, ceux qui sont résolues et ceux qui ne le sont pas. Peut-être faudrait-il les séparer dans des sujets différents et les marquer [résolu] au fur et à mesure.

Pour le pb du javascript.
Je viens de tester IE et FF, ceci inséré dans la feuille de style XSL fonctionne avec certitude sur les 2 navigateurs:
<script type="text/javascript" src="./javascript/functionsCours.js"></script>


Pour les pb d'accents.
Le bon encodage dans le document source c'est bien, mais il faut également spécifier le bon encodage pour le doc de sortie ce qui nécessite ceci dans la feuille XSL :
<xsl:output ... encoding="ISO-8859-1" ...  />
Alors comme problèmes il ne me reste que :

- 1) Utilisation de MathML
- 2) Inclusion d'un fichier javascript

Le problème d'accents est résolu Smiley smile

1) J'ai fait pas mal de tests, je vais essayer de recommencer depuis le début afin de bien vérifier que je n'ai rien oublié ...

2) Je viens d'essayer d'inclure le fichier javascript de cette manière :

<script type="text/javascript" src="./javascript/functionsCours.js"></script>


Aucun problème sous firefox, par contre sous IE même problème: plus aucune donnée n'est affichée Smiley decu

Je précise à nouveau le code PHP que j'utilise pour la transformation :

$xmldoc = domxml_open_file($cheminRoot."/cours/algebre/$file");

$xsldoc  = domxml_xslt_stylesheet_file ($cheminRoot."/styles/cours.xsl");
$result  = $xsldoc->process($xmldoc);
print utf8_decode($result->dump_mem());
1/ MathML
j'ai relu le post complet, je n'ai pas compris quel était le problème avec ton MathML
2/ javascript
j'ai testé avec mes petites mains et ça fonctionne. Je pense que tu dois avoir un autre problème, soit dans le script lui-même soit sur les éléments sur lesquels il agit.

Concernant les accents je te conseille plutôt de faire en sorte que la transformée produise un document avec le bon encodage plutôt que de faire la conversion avec PHP.
1) Voilà ce que j'utilise au niveau du XML pour utiliser MathML :

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd" [<!ENTITY mathml "http://www.w3.org/1998/Math/MathML">]>
....
<math xmlns="&mathml;">
 <msub>
  <mi>a</mi>
  <mn>0</mn>
....


et dans le xsl:


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
..
<HTML xmlns="http://www.w3.org/1999/xhtml">

...



Mais le code MathML n'est pas interprété :S , aurais-je oublié quelque chose ?


2) Je vais regarder ça alors ...

Pour les accents je vais essayer des suivre tes conseils Smiley smile
Oui j'avais bien vu qu'il était nécessaire de spécifier le bon Content-Type, j'ai donc essayé comme ça :

if((strpos($_SERVER['HTTP_ACCEPT'],"application/xhtml+xml") === false)
     && 
   (strpos($_SERVER['HTTP_USER_AGENT'],"MathPlayer") === false)
   ){
     header("Content-Type: text/html; charset=iso-8859-15");
    }
 else {header("Content-Type: application/xhtml+xml");
} 


Mais là tout le texte est envoyé sans mise en page, et la partie MathML n'est toujours pas interprétée comme elle devrait Smiley decu

Pour les accents j'ai utilisé <xsl:ouput comme tu me l'as conseillé, c'est parfait cela fonctionne très bien Smiley smile

Pour ce qui est du javascript, je cherche toujours le problème ... mais je ne vois pas trop d'où cela pourrait venir ...
Modifié par m@t (13 Feb 2006 - 19:22)
a écrit :
Mais là tout le texte est envoyé sans mise en page, et la partie MathML n'est toujours pas interprétée comme elle devrait
Ton fragment PHP à l'air correct en première approche. Mais il y a des conditions précises pour l'emploi de la fonction header : "N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichges PHP. Une erreur très classique est de lire un fichier avec..."
De toute façon pour border ce point là, tu dois vérifier explicitement que FF reçoit bien du application/xhtml+xml.

a écrit :
Pour les accents j'ai utilisé <xsl:ouput comme tu me l'as conseillé, c'est parfait cela fonctionne très bien
Ouf c'est déjà ça. Smiley ravi

a écrit :
Pour ce qui est du javascript, je cherche toujours le problème ... mais je ne vois pas trop d'où cela pourrait venir .
Je l'ai testé sur un cas simple et je t'assure que cela fonctionne. Sous FF tu peux effectuer la vérification suivante :
- XML + XSLT --> XHTML dont cette fameuse balise <script>
- tu ouvres l'inspecteur DOM, celui te montre l'arbre XML après transformation
- tu contrôles ainsi la présence de la balise <script> et de ses attributs

bonne chance...
a écrit :
Ton fragment PHP à l'air correct en première approche. Mais il y a des conditions précises pour l'emploi de la fonction header : "N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichges PHP. Une erreur très classique est de lire un fichier avec..."


Le code suivant est placé tout au début de mon fichier Smiley smile

<?php
if((strpos($_SERVER['HTTP_ACCEPT'],"application/xhtml+xml") === false) && (strpos($_SERVER['HTTP_USER_AGENT'],"MathPlayer") === false)){
	header("Content-Type: text/html; charset=iso-8859-15");
}else {
	header("Content-Type: application/xhtml+xml");
}


a écrit :
De toute façon pour border ce point là, tu dois vérifier explicitement que FF reçoit bien du application/xhtml+xml.


Ben lorsque je consulte les informations de la page sous FF, le type de la page est bien "application/xhtml+xml", pourtant toutes les données sont envoyées les unes à la suite des autres... Smiley ohwell Le problème viendrait-il d'ailleurs ? Voilà le résultat au cas où tu veux jeter un oeil : http://cilma.mathieu-jobard.info/filtre.php

Sinon un autre question, est-ce que c'est normal que cette déclaration d'espace de nom apparaissent dans toutes les balises :
xmlns="http://www.w3.org/1998/Math/MathML"


Pour le javascript je vais faire des essais de mon côté Smiley smile
Modifié par m@t (17 Feb 2006 - 11:03)
Pages :