Bonjour,

je suis confronté à un problème bizarre auquel je n'ai pas trouvé de réponse sur le net:
Dans une feuille xsl, je parse un document xml pour générer de l'xHTML, jusque là rien d'anormal.

Sauf que si dans ma feuille je mets une balise <div> ou <span> (ou autre je n'ai pas testé) sans rien dedans, elle sera prise uniquement comme une ouverture de balise, et donc les éléments du dessous seront contenus dedans.

Comme un exemple vaut toujours mieux qu'un long discours voici ma feuille xsl (c'est la div de classe "projectInfosHeader_left" qui pose problème):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:var="http://www.w3.org/TR/xhtml1/strict"
                xmlns:php="http://php.net/xsl"
                exclude-result-prefixes="xsl var php">

    <xsl:output
        indent="yes"
        method="xml"
        omit-xml-declaration="yes"
        encoding="UTF-8"/>

    <xsl:template match="/root">

        <h2>Mes réalisations</h2>
        
        <ul id="realisations">
            <xsl:for-each select="project">
            <li>
                <xsl:attribute name="id">
                    <xsl:value-of select="@id" />
                </xsl:attribute>
                
                <!-- Ajout d'un margin-bottom pour éviter un bug IE -->
                <xsl:if test="position() = last()">
                    <xsl:attribute name="style">margin-bottom: 0px</xsl:attribute>
                </xsl:if>
                <a class="project_overview">
                    <xsl:attribute name="href">
                        <xsl:value-of select="php:functionString('site_url', concat('creations/', @id))" />
                    </xsl:attribute> 
                    <img>
                        <xsl:attribute name="alt">
                            <xsl:value-of select="name" />
                        </xsl:attribute>
                        <xsl:attribute name="src">
                            <xsl:value-of select="php:functionString('app_url', concat('images/projects/project_', @id, '_half.jpg'))" />
                        </xsl:attribute>
                    </img>
                </a>
                <div class="projectInfosHeader_left"></div>
                <div>
                    <!-- Ajout d'un margin-bottom pour éviter un bug IE -->
                    <xsl:if test="position() = last()">
                        <xsl:attribute name="style">margin-bottom: 0px</xsl:attribute>
                    </xsl:if>
                    <ul class="floatRight">
                    <!-- Ajout d'un margin-bottom pour éviter un bug IE -->
                    <xsl:if test="position() = last()">
                        <xsl:attribute name="id">lastProject</xsl:attribute>
                    </xsl:if>

                        <li>
                            <a>
                                <xsl:attribute name="class">project_more</xsl:attribute>
                                <xsl:attribute name="href">
                                    <xsl:value-of select="php:functionString('site_url', concat('creations/', @id))" />
                                </xsl:attribute>
                                En savoir plus
                            </a>
                        </li>

                        <xsl:if test="url">
                            <li>
                                <a>
                                <xsl:attribute name="href">
                                    <xsl:value-of select="url" />
                                </xsl:attribute>
                                    Voir le site
                                </a>
                            </li>
                        </xsl:if>
                    </ul>
                    <ul class="floatLeft">
                        <li>
                            <strong>Client: </strong> <xsl:value-of select="client"/>
                        </li>
                        <li>
                            <strong>Prestation: </strong> 
                            
                            <xsl:for-each select="services/service">
                                <xsl:value-of select="." />
                                <xsl:if test="position() != last()">
                                    /
                                </xsl:if>
                            </xsl:for-each>
                        </li>
                    </ul>
                </div>
            </li>

            </xsl:for-each>
        </ul>

    </xsl:template>

</xsl:stylesheet>


Et voici le rendu html (du moins un extrait qui montre bien le problème):

<ul id="realisations">
  <li id="blabla">
    <a href="http://..." class="project_overview">
      <img src="http://....jpg" alt="blabla"/>
    </a>
    <div class="projectInfosHeader_left">
    <div>
      <ul class="floatRight">
        <li>
          <a href="http://..." class="project_more">
                                En savoir plus
                            </a>
        </li>
        <li>
          <a href="http://...">
                                    Voir le site
                                </a>
        </li>
      </ul>
      <ul class="floatLeft">
        <li><strong>Client: </strong>Aucun</li>
        <li><strong>Prestation: </strong>Web design
                                    /
                                Intégration xHTML
                                    /
                                CSS
                                    /
                                Accessibilité</li>
      </ul>
    </div>
  </div></li>


Quand par contre je mets quelque chose entre la balise <div class="projectInfosHeader_left"> et </div>, la balise est bien prise en compte.

Any idee?

Merci pour votre aide.

Dark.
Bonjour,

C'est effectivement bizarre. As-tu essayé avec <xsl:element name="div"><xsl:attribute name="class">projectInfosHeader_left</xsl:attribute></xsl:element>?
Modifié par Gilles (30 Nov 2009 - 09:12)
essaye peut être de générer ton xhtml différement. Via un script en JS par exemple.
Sinon essaye de la remplir avec un texte quelconque puis met la en "display:none" ou "visibility:hidden" avec un css.
oula non pas possible de générer mon code via js puisque je veux garder la dualité statique/ajax Smiley decu

Si je mets du texte entre les balises, à ce moment là tout se passe bien c'est ca qui est bizarre Smiley ohwell
Alors laisse peut être une balise :

<span id="invisible">blabla</span>


à l'intérieur de ton div avec comme code css :


span#invisible
{
 display:none;
}


c'est du bricolage mais ça devrait résoudre ton problème temporairement...
Modifié par freezystem (30 Nov 2009 - 12:10)
Effectivement ça résout le problème mais c'est vraiment moche Smiley decu

D'autres idée?

(Merci quand même au moins j'ai plus de texte visible pr le moment)
Eh bien, on n'a peut-être pas de solution. As-tu essayé

<xsl:element name="div">
    <xsl:attribute name="class">projectInfosHeader_left</xsl:attribute>
</xsl:element>

Attention: c'est différent de la première idée que je donnais, puisque j'insère ici un retour à la ligne... (et c'est bien parce qu'en tâtonnant, on peut par chance arriver à identifier le problème Smiley murf )
En fait c'est ce que j'avais déjà tenté quand tu m'avais passé ce code mais sans succès Smiley decu

Vraiment bizarre ça quand même comme interprétation: une div vide = une div ouvrante