Bonjour

ce post fait suite à celui-ci. Il s'agit d'une transformation côté client.

Je travaille avec Dreamweaver, quand je lance un aperçu avec Safari ou Firefox (depuis le menu Aperçu de Dreamweaver), pas de probleme. Mais quand j'appelle le fichier directement dans Firefox, le message suivant apparait:
"Error during XSLT transformation: XSLT transformation failed."
Alors que tout se passe bien sous Safari

Le probléme apparait depuis que j'ai ajouté xsl:element name="div" dans:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html"
 encoding="UTF-8"
 doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
  <xsl:key name="cle" match="item" use="parent"/>
  <xsl:template match="/">
    <xsl:apply-templates select="plist/item[not(parent)]">
      <xsl:with-param name="marge" select="''"/>
      <xsl:sort select="nom" order="ascending"/>
    </xsl:apply-templates>
  </xsl:template>
  <xsl:template match="item">
    <xsl:if test="type!='contenu'">
    <xsl:param name="marge" />
      <xsl:value-of select="concat($marge,'',nom)"/>
      <xsl:element name="div"><!-- ICI -->
        <xsl:attribute name="id"><xsl:value-of select="idunique" /></xsl:attribute>
        <xsl:attribute name="class">open</xsl:attribute>
        <xsl:apply-templates select="key('cle',idunique)">
          <xsl:with-param name="marge" select="concat($marge,'-')"/><xsl:sort select="nom" order="ascending"/>
        </xsl:apply-templates>
      </xsl:element><!-- ET LÀ -->
    </xsl:if>
    <xsl:if test="type='contenu'">
    <xsl:param name="marge" />
      <xsl:value-of select="concat($marge,'',nom)"/>
      <br/>
      <xsl:apply-templates select="key('cle',idunique)">
        <xsl:with-param name="marge" select="concat($marge,'-')"/><xsl:sort select="nom" order="ascending"/>
      </xsl:apply-templates>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>


Pour transformer ce code xml


<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="menu.xsl" type="text/xsl"?>
<plist>
  <item>
    <nom>master</nom>
    <type>menu</type>
    <idunique>1</idunique>
  </item>
  <item>
    <nom>Dossier2</nom>
    <type>dossier</type>
    <parent>1</parent>
    <idunique>2</idunique>
  </item>
  <item>
    <nom>Dossier1</nom>
    <type>dossier</type>
    <parent>1</parent>
    <idunique>3</idunique>
  </item>
  <item>
    <nom>DossierX</nom>
    <type>dossier</type>
    <parent>5</parent>
    <idunique>4</idunique>
  </item>
  <item>
    <nom>Dossier</nom>
    <type>dossier</type>
    <parent>2</parent>
    <idunique>5</idunique>
  </item>
  <item>
    <nom>DossierY</nom>
    <type>dossier</type>
    <parent>5</parent>
    <idunique>6</idunique>
  </item>
  <item>
    <nom>Element</nom>
    <type>contenu</type>
    <parent>3</parent>
    <idunique>7</idunique>
  </item>
  <item>
    <nom>ElementA</nom>
    <type>contenu</type>
    <parent>4</parent>
    <idunique>8</idunique>
  </item>
  <item>
    <nom>ElementB</nom>
    <type>contenu</type>
    <parent>4</parent>
    <idunique>9</idunique>
  </item>
  <item>
    <nom>Element1</nom>
    <type>contenu</type>
    <parent>6</parent>
    <idunique>10</idunique>
  </item>
  <item>
    <nom>Element1</nom>
    <type>contenu</type>
    <parent>1</parent>
    <idunique>11</idunique>
  </item>
  <item>
    <nom>Element3</nom>
    <type>contenu</type>
    <parent>1</parent>
    <idunique>12</idunique>
  </item>
  <item>
    <nom>Element2</nom>
    <type>contenu</type>
    <parent>1</parent>
    <idunique>13</idunique>
  </item>
  <item>
    <nom>Element2</nom>
    <type>contenu</type>
    <parent>6</parent>
    <idunique>14</idunique>
  </item>
  <item>
    <nom>Element</nom>
    <type>contenu</type>
    <parent>2</parent>
    <idunique>15</idunique>
  </item>
</plist>


Voici le code source généré qui semble tout à fait correct:

<html>
<head></head>
<body>
master
<div id="1" class="open">-Dossier1
  <div id="3" class="open">--Element<br>
  </div>
  -Dossier2
  <div id="2" class="open">--Dossier
    <div id="5" class="open">---DossierX
      <div id="4" class="open">----ElementA<br>
        ----ElementB<br>
      </div>
      ---DossierY
      <div id="6" class="open">----Element1<br>
        ----Element2<br>
      </div>
    </div>
    --Element<br>
  </div>
  -Element1<br>
  -Element2<br>
  -Element3<br>
</div>
</body>
</html>


Savez-vous pourquoi?
Malheureusement je ne dispose pas de windows, je n'ai que Mac OSX pour tester mon code.
Par avance merci de votre aide.
Modifié par dj DMSR (01 Oct 2007 - 04:31)
Modérateur
Salut, Smiley smile

As-tu essayé en mettant le xsl:apply-templates avant les xsl:attribute ou encore en mettant xsl:sort avant le xsl:with-param ? Je ne suis pas sûr que cela change grand chose mais vu que je ne vois pas d'erreur particulière... Smiley sweatdrop

Sinon, pourquoi fais-tu la transformation côté client (déconseillée) ? As-tu essayé côté serveur pour voir si l'erreur ne provenait pas d'une mauvaise interprétation de Firefox ?
Modifié par koala64 (01 Oct 2007 - 09:05)
Salut,
merci de ton intérêt.
Non, je dois rester côté client, c'est imposé par le projet.
Par contre, j'ai un programme ici, TestXSLT pour Mac OSX qui utilise les processeurs Sablotron, Libxslt, Saxon et Xalan-J pour tester ce que ça donnerait côté serveur. Et bien seul Libxslt fonctionne, les autres plantent. J'en déduis que Safari, Opera et Dreamweaver utilisent (sans doute) Libxslt et pas Firefox (ni Netscape, ni Camino), sous OSX.
J'ai refait des tests, déplacer ce que tu dis, ça ne donne rien.
Et en fait ce n'est pas le "div" qui pose problème, mais le test conditionnel xsl:if.
Je vais continuer d'autres tests, mais quel dommage, je suis si content du résultat sous Safari!