bug [JAVA - XALAN] - Programmation
Marsh Posté le 07-06-2001 à 12:13:43
en fait le pb vient de la version de xalan.
le code correct est:
import javax.swing.*;
import java.io.*;
import org.apache.xalan.xslt.*;
public class generateClass
{
generateClass(File f)
{
XSLTProcessor processor = XSLTProcessorFactory.getProcessor(new org.apache.xalan.xpath.xdom.XercesLiaison());
XSLTInputSource input=new XSLTInputSource(f.getPath());
XSLTInputSource style=new XSLTInputSource("schema.xsl" );
XSLTResultTarget result=new XSLTResultTarget("result.html" );
try
{
processor.process(input,style,result);
}
catch(org.xml.sax.SAXException e){}
}
}
pb: quand j'execute, j'ai un message d'erreur m'indiquant que le fichier passé en paramètre n'a pas pu être parser.
???????????????,
Marsh Posté le 07-06-2001 à 19:09:15
Utilises avant d'executer ton programme un parseur afin de lire ton fichier xml et xsl afin de savoir si ces derniers sont au moins bien formé
Marsh Posté le 08-06-2001 à 13:24:58
mon xsl et xml sont validé par xml spy, le pb ne vient apparemment pas de là (de plus je parcours le xml avec dom sa&ns pb)
Marsh Posté le 08-06-2001 à 14:24:47
je sais que ton fichier est correct, mais mon code aussi a priori.:gun:
est ce qqu'un d'exterieur au pb a une idée
Marsh Posté le 08-06-2001 à 14:29:52
j'ai une piste, quand je lance le .xml dans internet explorer 5, j'obtiens le squelette dessiné par mon xsl mais aucune donnée du xml ne s'affiche...
Marsh Posté le 08-06-2001 à 14:35:33
Donnez nous le code du fichier XSL car les templates ne sont peut etre pas bien definies ... ou alors un positionnement maladroit existe mauvais renvoie de gabarit ....
Marsh Posté le 08-06-2001 à 14:43:54
<?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">
<xsl:output method="html" omit-xml-declaration="yes"/>
<xsl:template match="/">
<html>
<body>
<h1>VI PRIMITIVES</h1>
<br/> <xsl:for-each select="schema/primitive" >
<p>
<h2><br>enum <xsl:value-of select="p_name"/>{</br></h2>
<xsl:apply-templates select="list"/>
<br>}</br>
</p>
</xsl:for-each>
<h1>VII CLASSES</h1>
<br/> <xsl:for-each select="schema/class" >
<p>
<h2><br><xsl:value-of select="c_name"/></br></h2>
<br><xsl:value-of select="c_desc"/></br>
<h3><br>SUBCLASS OF:</br></h3>
<xsl:apply-templates select="subclass"/>
<h3><br>EXTENDED CLASS ATTRIBUTE </br></h3>
<xsl:apply-templates select="c_att"/>
<h3><br>CONTENT : </br></h3>
<xsl:apply-templates select="content"/>
</p>
</xsl:for-each>
<h1>VIII NODES</h1>
<br/> <xsl:for-each select="schema/node" >
<p>
<h2> <br><xsl:value-of select="n_name"/></br></h2>
<br><xsl:value-of select="n_desc"/></br>
<h3><br>MEMBER OF:</br></h3>
<xsl:apply-templates select="memberof"/>
<h3><br>INHERITED CLASS ATTRIBUTES</br></h3>
<xsl:apply-templates select="in_att"/>
<h3><br>EXTENDED NODE ATTRIBUTES</br></h3>
<xsl:apply-templates select="ext_att"/>
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>
<xsl:template match="schema/primitive/list">
<br><xsl:value-of select="."/></br>
</xsl:template>
<xsl:template match="schema/class/subclass">
<br><xsl:value-of select="."/></br>
</xsl:template>
<xsl:template match="schema/class/c_att">
<br><b><xsl:value-of select="./c_att_name"/></b></br>
<br><xsl:value-of select="./c_att_desc"/>
primary : <xsl:value-of select="./c_att_pri"/> required : <xsl:value-of select="c_att/c_att_req"/></br>
<br/>
</xsl:template>
<xsl:template match="schema/class/content">
<br><xsl:value-of select="."/></br>
</xsl:template>
<xsl:template match="schema/node/memberof">
<br><xsl:value-of select="."/></br>
</xsl:template>
<xsl:template match="schema/node/in_att">
<br><b><xsl:value-of select="./in_att_name"/></b></br>
<br><xsl:value-of select="./in_att_desc"/>
primary : <xsl:value-of select="./in_att_pri"/> required : <xsl:value-of select="./in_att_req"/></br>
<br/>
</xsl:template>
<xsl:template match="schema/node/ext_att">
<br><b><xsl:value-of select="./ext_att_name"/></b></br>
<br><xsl:value-of select="./ext_att_desc"/>
primary : <xsl:value-of select="./ext_att_pri"/> required : <xsl:value-of select="./ext_att_req"/></br>
<br/>
</xsl:template>
</xsl:stylesheet>
voila la bête
Marsh Posté le 08-06-2001 à 14:49:34
Oula cela me rappelle un precedent topic, envoies nous le fichier XML egalement car je crains que cela soit normal que rien ne s'affiche etant donné que tu ne fais pas attention au contexte lors du parsing par ton document XSL.
Exemple :
Code :
|
Ici tu appelles le motif "list" et non pas le motif "schema/primitive/list" donc ton motif doit etre
Code :
|
Car le noeud xsl:for-each place le contexte sur le noeud schema primitive ....
[PS] Resolvons le probleme pour IE sachant que ce n'est pas le meme parseur pour XALAN ...
Marsh Posté le 08-06-2001 à 14:53:29
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="schema.xsl"?>
<!-- edited with XML Spy v3.5 (http://www.xmlspy.com) by ismea (ismea) -->
<!DOCTYPE schema [
<!ELEMENT schema (primitive*, class*, node*)>
<!ELEMENT primitive (p_name, list+)>
<!ELEMENT class (c_name, c_desc?, subclass*, c_att*, content*)>
<!ELEMENT c_att (c_att_name, c_att_desc?, c_att_pri, c_att_req)>
<!ELEMENT node (n_name, n_desc?, memberof*, in_att*, ext_att*)>
<!ELEMENT in_att (in_att_name, in_att_desc?, in_att_pri, in_att_req)>
<!ELEMENT ext_att (ext_att_name, ext_att_desc?, ext_att_pri, ext_att_req)>
<!ELEMENT p_name (#PCDATA)>
<!ELEMENT list (#PCDATA)>
<!ELEMENT c_name (#PCDATA)>
<!ELEMENT c_desc (#PCDATA)>
<!ELEMENT subclass (#PCDATA)>
<!ELEMENT content (#PCDATA)>
<!ELEMENT n_name (#PCDATA)>
<!ELEMENT n_desc (#PCDATA)>
<!ELEMENT memberof (#PCDATA)>
<!ELEMENT c_att_name (#PCDATA)>
<!ELEMENT c_att_desc (#PCDATA)>
<!ELEMENT c_att_pri (#PCDATA)>
<!ELEMENT c_att_req (#PCDATA)>
<!ELEMENT in_att_name (#PCDATA)>
<!ELEMENT in_att_desc (#PCDATA)>
<!ELEMENT in_att_pri (#PCDATA)>
<!ELEMENT in_att_req (#PCDATA)>
<!ELEMENT ext_att_name (#PCDATA)>
<!ELEMENT ext_att_desc (#PCDATA)>
<!ELEMENT ext_att_pri (#PCDATA)>
<!ELEMENT ext_att_req (#PCDATA)>
]>
<schema>
<primitive>
<p_name>C_CV_Qualifier</p_name>
<list>C_No_CV_QUALIFIER</list>
<list>C_Const_CV_QUALIFIER</list>
<list>C_Const_Volatile_CV_QUALIFIER</list>
<list>C_Volatile_CV_QUALIFIER</list>
<list>C_CV_QUALIFIER_Count</list>
</primitive>
<class>
<c_name>C_TEMPLATE_INST</c_name>
<c_desc> A class including nodes used to represent template instantiations. An instantiation references a C_TEMPLATE_ID (attribute has_template_id) node to specify actual argument to the associated template generic parameters. Such an instantiation is included in the namespace containing the template (has_enclosing_scope). Implicit instantiation are represented by C_IMP_TEMPLATE_INST subclass. </c_desc>
<subclass>C_DECLARATION</subclass>
<subclass>C_REGION_ITEM</subclass>
<subclass>C_SEQUENCE_ITEM</subclass>
<subclass>C_ANNOTABLE_ITEM</subclass>
<subclass>C_UNIVERSE</subclass>
<c_att>
<c_att_name> has_template_id</c_att_name>
<c_att_desc>a C_TEMPLATE_ID node which describes the association of actual arguments to the template generic parameter.</c_att_desc>
<c_att_pri>true</c_att_pri>
<c_att_req>false</c_att_req>
</c_att>
<content>C_IMP_TEMPLATE_INST</content>
<content>c_func_inst</content>
<content>c_class_inst</content>
</class>
<node>
<n_name>c_literal</n_name>
<n_desc>A C_EXPRESSION node used to describe C/C++ literal including integer literal, floating literal, and string literal. A C_STATIC_VALUE node referenced by has_value attribute represents the value of the literal. </n_desc>
<memberof>C_EXPRESSION</memberof>
<memberof>C_ACTUAL</memberof>
<memberof>C_ANNOTABLE_ITEM</memberof>
<memberof>C_UNIVERSE</memberof>
<in_att>
<in_att_name> has_temp</in_att_name>
<in_att_desc> An attribute which points to an Int_32 value that, may be used to represent any temporary user-defined information. This attribute is always set to 0 upon saving the unit.</in_att_desc>
<in_att_pri>true</in_att_pri>
<in_att_req>false</in_att_req>
</in_att>
<in_att>
<in_att_name> has_srcpos</in_att_name>
<in_att_desc>The source file position (Source_Info) of the first token associated with the node.</in_att_desc>
<in_att_pri>true</in_att_pri>
<in_att_req>false</in_att_req>
</in_att>
<in_att>
<in_att_name> has_type_id</in_att_name>
<in_att_desc> Points toa C_TYPE_ID node representing the type of the expression.</in_att_desc>
<in_att_pri>false</in_att_pri>
<in_att_req>true</in_att_req>
</in_att>
<ext_att>
<ext_att_name> has_value </ext_att_name>
<ext_att_desc>An attribute which points to a C_STATIC_VALUE node denoting the literal value.</ext_att_desc>
<ext_att_pri>true</ext_att_pri>
<ext_att_req>true</ext_att_req>
</ext_att>
</node>
</schema>
voila la deuxieme bébête pour le coup du "." ou du schema/primitive/list, je veux bien croire que ca vient de là. Mais sur ce coup je suis en autoformation et je n'ai trouvé aucun document clair m'expliquant quand employer l'un ou l'autre, alors c'est possible que ca ressemble à de la bidouille.
Marsh Posté le 08-06-2001 à 15:19:39
Attention je ne te blame pas ... Point de salue dans la coryance, essaie ce que je t'expose et pour ce qui est de l'autoformation je ne peux que t'encourager et te donner un simple conseil qui est de faire les tutoriaux que tu peux trouver sur le Web comme ceux developpés par Microsoft msdn.microsoft.com/xml ou ceux sur le site http://www.w3schools.com ... sur le site sun pour le XML et java ... afin de mieux comprendre le formatage d'un fichier XML par une feuille de style.
Marsh Posté le 08-06-2001 à 15:44:02
ok, ce que je n'avais pas saisi c'est que les tags avait une action sur mon positionnement dans le doc.
j'ai donc corrigé cela
par ex:
<xsl:for-each select="schema/primitive" >
<p>
<h2><br>enum <xsl:value-of select="p_name"/>{</br></h2>
<xsl:apply-templates select="list"/>
<br>}</br>
</p>
</xsl:for-each>
<xsl:template match="list">
<br><xsl:value-of select="."/></br>
</xsl:template>
et
<xsl:template match="in_att">
<br><b><xsl:value-of select="in_att_name"/></b></br>
<br><xsl:value-of select="in_att_desc"/>
primary : <xsl:value-of select="in_att_pri"/> required : <xsl:value-of select="in_att_req"/></br>
<br/>
</xsl:template>
mais IE5 ne veux toujours rien savoir...
[edit]--Message édité par prettysmile--[/edit]
Marsh Posté le 08-06-2001 à 15:56:49
G esssayé ton code et il marche sans probleme sous mon IE, le probleme ne doit pas venir de la quand a ce que je t'expliquais je me pourfends car je me suis trompé car en fait la différence entre les motifs que je preconisais et les tiens c que toi tu te limite au fait que list doit etre fils de primitive et schema .... Désolé le probleme ne vient pas de la ... Peut etre un probleme de DLL pour IE5 quelle version de DLL pour le parseur XML il y a la version 3 disponible sur msdn.microsoft.com/xml ...
[CHGT de PSEUDO du à un flood ... sur blabla]
[edit]--Message édité par Otto--[/edit]
Marsh Posté le 08-06-2001 à 16:03:34
j'ai ie5.5, et vraiement ca ne marche pas, le truc c'est que ca ne passe pas nom plus sur le pc voisin (ie5.0)
Marsh Posté le 11-06-2001 à 10:34:09
Il y a aucune erreur ?
Cela t'affiche quoi ?
Tu peux faire tourner xsl debugger present sur le site de Microsoft si tu veux connaitre chaque pas de ton XSL quand cela tourne ... msdn.microsoft.com/xml ...
Marsh Posté le 11-06-2001 à 12:16:16
le fichier est validé par xml spy, il détecte juste l'absence de référence à une dtd (mais comme celle ci est interne...) et réussi la transformation.
Marsh Posté le 11-06-2001 à 12:18:30
Et l'affichage cela donne koi, car sur ma machine aucun probleme ...
Marsh Posté le 11-06-2001 à 12:26:47
Otto a écrit a écrit : Et l'affichage cela donne koi, car sur ma machine aucun probleme ... |
ben, à l'affichage, j'ai que le squelette du xsl, aucune donnée provenant du xml:
VI PRIMITIVES
enum {
}
VII CLASSES
SUBCLASS OF:
EXTENDED CLASS ATTRIBUTE
CONTENT :
VIII NODES
MEMBER OF:
INHERITED CLASS ATTRIBUTES
EXTENDED NODE ATTRIBUTES
primary : required :
primary : required :
primary : required :
Marsh Posté le 11-06-2001 à 13:28:00
en fait, pour le pb xalan, je me demande si le pb ne viendrait pas de "new org.apache.xalan.xpath.xdom.XercesLiaison()"
mais je ne suis pas vraiement au point sur Xpath, j'étais sensée l'initialiser qqpart?
Marsh Posté le 11-06-2001 à 14:52:14
soudain un doute m'assaille, Xalan java 1 est il compatible avec le jdk 1.3?
Marsh Posté le 11-06-2001 à 16:43:53
XML+XSL=> HTML et enfin ca marche... en utilisant xalan 2. Mes fichiers xml et xsl etait bien valide, je pense donc qu'il existe des problèmes de compatibilité entre xalan 1 et le jdk 1.3
Merci à tous pour votre aide, voici le code qui marche pour les curieux:
import javax.swing.*;
import java.io.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
//import org.apache.xalan.xslt.*;
public class generateClass
{
generateClass(File f,JMenuItem m)
{
TransformerFactory tFactory =TransformerFactory.newInstance();
Transformer t=null;
try
{
t =tFactory.newTransformer(new StreamSource("schema.xsl" ));
}
catch(TransformerConfigurationException e)
{}
try
{
try
{
t.transform(new StreamSource(f),new StreamResult( new FileOutputStream("pipo.html" )));
}
catch(TransformerException e){}
}
catch(FileNotFoundException e){}
}
}
où f est le fichier xml
Marsh Posté le 11-06-2001 à 16:44:27
Pour la compatibilité, il suffit de regarder cela sur apache.org ou javasoft mais sinon de toute maniere ce n'est pas normal que cela ne t'affiche rien ... Je ne comprends pas ...
Essaie
<xsl:copy-of select="."> dans ton fichier XSL afin de connaitre ou cela le positionne :
Code :
|
Marsh Posté le 11-06-2001 à 16:58:51
Si je fais cela, j'obtiens une superbe feuille vierge sous ie.
Marsh Posté le 11-06-2001 à 17:13:15
Ben la je ne comprends pas tout ... et si tu enleves cette ligne : <?xml-stylesheet type="text/xsl" href="schema.xsl"?>
de ton fichier XML. Que te donne IE ?
Marsh Posté le 11-06-2001 à 17:26:36
Cela peut venir d'une erreur inherente à IE corrigé depuis par XML version 3 peut etre :
Les règles modèles (templates) non implicites
La spécification XSLT 1.0 préconise que dans les moteurs XSLT deux règles modèles (templates) soient implicites ou "internes" (build-in) :
<xsl:template match="/|*"><xsl:apply-templates/></xsl:template>
<xsl:template match="text()"><xsl:value-of select="."/></xsl:template>
Or Microsoft a choisi de ne pas rendre ces règles modèles implicites dans son moteur -- voir sur le site de Microsoft Simulating Built-in Templates.
Si vous voulez que votre feuille de style XSL fonctionne à la manière prévue par le W3C vous devez reproduire ces deux règles modèles en tête de votre feuille de style, avant tout autre règle modèle : c'est Microsoft lui-même qui vous le dit.
Si vous ne le faites pas, vous devez vous attendre à un fonctionnement un peu particulier de votre feuille de style XSL.
Faites l'essai : prenez un document XML quelconque et tranformez-le avec une feuille de style vide en utilisant successivement le moteur XSLT de MSIE5 et un autre logiciel XSLT, par exemple iXSLT. Que constatez-vous ?
Vous constatez que le moteur XSLT de MSIE5 a produit un document vide, alors que le second logiciel a reproduit, dans l'ordre, tous les noeuds textuels de votre document (= votre document sans les balises).
Si vous reproduisez en tête de votre feuille de style MSXSL les deux règles modèles non implicites reproduites plus haut (d'après la documentation de Microsoft) vous aurez d'abord la surprise de constater que la première de ces règles modèles provoque une erreur et doit donc être coupée en deux :
<xsl:template match="/"><xsl:apply-templates/></xsl:template>
<xsl:template match="*"><xsl:apply-templates/></xsl:template>
<xsl:template match="text()"><xsl:value-of select="."/></xsl:template>
(En pratique, la première de ces règles modèles sera presque toujours redéfinie par vous et sera donc inutile.)
Si vous reproduisez en tête de votre feuille de style MSXSL ces trois (ou ces deux) règles modèles non implicites, vous aurez enfin la satisfaction de voir que le moteur Microsoft produit enfin un résultat équivalent à celui de iXSLT.
Que font ces trois règles modèles exactement ? Tout simplement ceci :
première règle modèle : se positionner sur la racine
seconde règle modèle : parcourir tout l'arbre XML
troisième règle modèle : reproduire tous les noeuds textuels.
Que se passera-t-il si vous n'avez pas ajouté ces règles modèles en tête de votre feuille de style. Eh bien vous devrez alors :
forcer le moteur à parcourir votre arbre xml, ou du moins la partie de cet arbre qui vous intéresse. Pour ce faire il vous faudra :
soit utiliser un mécanisme du type <xml:for-each...> (ce qui ne convient que pour le XML régulier)
soit faire des règles modèles (vides éventuellement) pour toutes les balises intermédiaires entre la racine et les balises que vous souhaitez exploiter
soit faire depuis les règles modèles de niveau supérieur des branchements explicites vers les balises de niveau inférieur que vous souhaitez exploiter, du genre <xsl:apply-templates select="balise_à_exploiter" />, et non pas <xsl:apply-templates /> qui ne brancherait que sur les balises de niveau immédiatement inférieur
forcer le moteur à reproduire les noeuds textuels qui vous intéressent. Autrement dit la règle modèle ultime devra contenir <xsl:value-of /> et non pas <xsl:apply-templates /> qui ne produirait rien
à voir sur cette page : http://www.chez.com/xml/astuces/index.htm#ie5xslt
Marsh Posté le 13-06-2001 à 09:23:18
merci pour l'@ et pur t'être interesse au pb
Pour ce qui est conseillé il me semble que c'est ce que j'ai appliqué dans mon code (utiliser des <xsl:for each> )
pour le pb d'ie je vois vraiement, j'aitesté sur tous les postes de l'école+ de la maison et ...rien
Mais comme mon pb était de générer du HTML à partir de java et que ca ca marche, je chercherais à resoudre le pb ie pendant les vacances.
Marsh Posté le 13-06-2001 à 10:26:28
Ben c quand meme bizarre le probleme avec IE, jette un coup d'oiel sur MSXML.dll quand meme plus d'informations sur msdn.microsoft.com/xml sinon felicitations pour la reussite de ton programme ...
[edit]--Message édité par Nabab--[/edit]
Marsh Posté le 07-06-2001 à 09:43:34
import javax.swing.*;
import java.io.*;
import javax.xml.transform.*;
public class generateClass
{
generateClass(File f)
{
// 1. Instantiate a TransformerFactory.
javax.xml.transform.TransformerFactory tFactory =javax.xml.transformerTransformerFactory.newInstance();
// 2. Use the TransformerFactory to process the stylesheet Source and
// generate a Transformer.
javax.xml.transform.Transformer transformer = tFactory.newTransformer
(new javax.xml.transform.stream.StreamSource("schema.xsl" );
// 3. Use the Transformer to transform an XML Source and send the
// output to a Result object.
transformer.transform(new javax.xml.transform.stream.StreamSource(f),
new javax.xml.transform.stream.StreamResult( new
java.io.FileOutputStream"foo.out" )));
}
}
voici mon code, quand je compile, forte ne trouve pas transformTransformerFactory, que j'ai pourtant placé dans le repertoire ext du jdk (donc, pas besoin de mettre à jour le ClassPath). Qqu'un peut il m'aider