Bonsoir à tous!!

Je viens de découvrir le xslt que j'ai mis en place grâce à l'objet XSLTProcessor de PHP.

Tout se passe à merveille, sauf qu'un petit obstacle me freine:

Dans ma feuille xsl j'appelle une fonction php pour laquelle je souhaite passer un paramètre moitié dynamique, moitié fixe (concaténer quoi), mais il semblerait que le parser soit pas d'accord avec mon " 'creations/'@id "...(le tout en couleurs juste au dessous Smiley biggrin )



<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:php="http://php.net/xsl"
    version="1.0">

    <xsl:output
        indent="yes"
        method="xml"
        omit-xml-declaration="yes"
        encoding="UTF-8"
        doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

    <!-- Affichage simple -->
    <xsl:template match="/root">

        <h2>Mes réalisations</h2>
        
        <ul id="realisations">
            <xsl:for-each select="project">
            <li>
                <a>
                    <xsl:attribute name="href">
                        <xsl:value-of select="php:functionString('site_url', 'creations/'@id)" />
                    </xsl:attribute> 
                    
                    <xsl:value-of select="name"/>
                </a> : <xsl:value-of select="description"/></li>

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

    </xsl:template>

</xsl:stylesheet>


De plus, dans ma page xHTML finale, les préfixes de namespace apparaissent, tout comme le doctype (ce que j'aimerais bien entendu omettre):


<!DOCTYPE h2 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<h2 xmlns:php="http://php.net/xsl">Mes réalisations</h2><ul xmlns:php="http://php.net/xsl" id="realisations">
  <li><a href="http://www.monSite.fr/blablabla">blablabla</a> : blablabla</li>
</ul>


Merci pour l'aide que vous pourrez m'apporter Smiley smile

[EDIT] Je viens de trouver pour les paramètres de la fonction:

il faut utiliser la syntaxe: "<xsl:value-of select="php:functionString('site_url', concat('creations/'@id))" />

Reste à trouver pour l'intégration dans un page xHTML sans avoir le doctype et le préfixes namespace...
Modifié par Dark$hadow (04 May 2009 - 11:13)
Bonjour monsieur l'Alien,

Dark$hadow a écrit :
[...]

De plus, dans ma page xHTML finale, les préfixes de namespace apparaissent, tout comme le doctype (ce que j'aimerais bien entendu omettre):


<!DOCTYPE h2 PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<h2 xmlns:php="http://php.net/xsl">Mes réalisations</h2><ul xmlns:php="http://php.net/xsl" id="realisations">
  <li><a href="http://www.monSite.fr/blablabla">blablabla</a> : blablabla</li>
</ul>


Merci pour l'aide que vous pourrez m'apporter Smiley smile

[...]


C'est trés bien, tu as utilisé l'élément xsl:output à bon escient.

Mais il est possible d'y ajouter encore un attribut qui pourrait peut-être résoudre la question du DOCTYPE, ce serait d'ajouter à l'élément xsl:output, l'attribut media-type (xsl:output - w3c/TR/XSLT)

Je n'utilise jamais XHTML, mais je sais qu'il existe avec lui quelques bizzareries, comme par exemple la quasi-obligation de l'omission de la déclaration XML. Peut-être qu'en ajoutant un attribut media-type, le document en sortie serat-il mieux traité par le processeur XSLT (s'il y prête attention). Quelques spécifications MIME Type recommandées sont présentées ici : XHTML Media Types - Second Edition.

Pour le prefix d'espace de nom php:, as-tu essayé de lui substituer l'espace de nom par défaut ? Tu peux en faire l'espace de nom par défaut en écrivant

xmlns="http://php.net/xsl"

au lieu de
xmlns:php="http://php.net/xsl"


Bon courage Smiley biggrin
Modifié par hibou57 (06 May 2009 - 14:14)
Merci pour ta réponse.

J'ai oublié de revenir mettre ma solution (parce que oui j'ai trouvé Smiley smile ):


<?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="html"
        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>
                <!-- 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>
                    <xsl:attribute name="href">
                        <xsl:value-of select="php:functionString('site_url', concat('creations/', @id))" />
                    </xsl:attribute> 
                    
                    <xsl:value-of select="name"/>
                </a> : <xsl:value-of select="description"/>
            </li>

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

    </xsl:template>

</xsl:stylesheet>


Donc j'ai réussi à supprimer toutes les déclarations avec ces éléments:


exclude-result-prefixes="xsl var php"
omit-xml-declaration="yes"


En espérant que ça puisse servir à d'autres dans la même situation Smiley ravi
Dark$hadow a écrit :
[...]


exclude-result-prefixes="xsl var php"
omit-xml-declaration="yes"


En espérant que ça puisse servir à d'autres dans la même situation Smiley ravi

Instructif, merci Smiley smile