3 votes

Transformation de XML en XML avec XSLT dans Firefox et IE

J'ai fait une transformation de plusieurs formats XML vers un standard. Mon XSL ressemble à celui qui suit :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="list | store">
        <list>
            <xsl:for-each select="item | product | product-store">
            <item>
                <name>
                    <xsl:choose>
                        <xsl:when test="name"><xsl:value-of select="substring-before(name, ' ')" /></xsl:when>
                        <xsl:otherwise><xsl:value-of select="name | title" /></xsl:otherwise>
                    </xsl:choose>
                </name>
                <desc>
                    <xsl:choose>
                        <xsl:when test="name"><xsl:value-of select="substring-after(name, ' ')" /></xsl:when>
                        <xsl:otherwise><xsl:value-of select="desc" /></xsl:otherwise>
                    </xsl:choose>
                </desc>
                <nr><xsl:value-of select="index | number" /></nr>
            </item>
            </xsl:for-each>
        </list>
    </xsl:template>
</xsl:stylesheet>

mon exemple de XML est

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
<list>
    <item>
      <index>1362242627</index>
      <name>test 22</name>  
    </item>
    <item>
      <index>2362625609</index>
      <name>test 4</name>  
    </item>
    <item>
      <index>736274650</index>
      <name>test 76</name>  
    </item>
</list>

Pourquoi ne s'affiche-t-il pas correctement dans des navigateurs comme Firefox 17, IE9 et Google Chrome ? Ils l'affichent comme un texte normal, mais le type de retour est "text/xml". Il fonctionne correctement dans Opera uniquement.

6voto

Martin Honnen Points 46896

Je pense que le problème est de savoir quel est l'affichage "correct". Les navigateurs comme Firefox ou IE partent du principe qu'une fois que vous avez chargé un document XML avec une balise xml-stylesheet instruction de traitement de type text/xsl dans une fenêtre de navigateur, vous voulez transformer le XML en quelque chose que le navigateur sait rendre, comme du HTML ou, de nos jours, du (X)HTML plus SVG (ou plus MathML). Cependant, votre feuille de style prend l'entrée XML et la transforme en un format de résultat XML inconnu du navigateur, de sorte que tout ce qu'il fait est de rendre le contenu des nœuds de texte dans l'arbre de résultat. Opera semble transformer l'entrée XML en un résultat XML, mais il semble ensuite reconnaître que le format du résultat est inconnu et décide ainsi de rendre l'arbre source du résultat. C'est peut-être ce que vous préférez, mais je ne suis pas sûr qu'il existe une spécification exigeant ce comportement.

0voto

Paul Sweatte Points 8668

La présélection des caractères de nouvelle ligne et de tabulation fonctionne si xsl:output="text" dans Firefox et Chrome. Ironiquement, IE ignore l'indentation en mode texte. Voici une feuille de style auto-référencée qui en fait la démonstration :

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="newline-indent.xml"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns=""
                >

<!-- Output HTML doctype with text/html content-type and without XML declaration-->
<xsl:output method="text" encoding="utf-8" version="1.0" media-type="text/plain" indent="yes" standalone="no" omit-xml-declaration="no"/>

<!-- Output the HTML markup-->
<xsl:template xml:space="preserve" match="/">
  <root>
    <child>1 &#13;&#10;</child>   
    <child>
      <grandchild>&#09; 1.1  &#13;&#10;</grandchild>
    </child>
    <child>
      <grandchild>
        <great-grandchild>&#09; &#09; 1.1.1</great-grandchild>
      </grandchild>
    </child>
  </root>
</xsl:template>
</xsl:stylesheet>

Le commentaire suivant d'un Bug de Mozilla explique pourquoi la sérialisation XML ne fonctionne pas pour l'espace de noms XML :

Dans la version actuelle de Gecko, le sérialiseur XML est utilisé pour sérialiser le contenu XHTML.

Utilisez un style et des espaces littéraux dans les balises pour formater la sortie dans IE :

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="newline-indent-ie.xml"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns=""
                >

<xsl:output method="xml" encoding="utf-8" version="1.0" media-type="application/xml" indent="yes" standalone="no" omit-xml-declaration="no"/>

<xsl:template match="/">
  <style>* { white-space:pre-wrap; }</style>
  <root>
    <child  >1</child>   
    <child>
      <grandchild  >1.1</grandchild>
    </child>
    <child>
      <grandchild>
        <great-grandchild  >1.1.1</great-grandchild>
      </grandchild>
    </child>
  </root>
</xsl:template>
</xsl:stylesheet>

Références

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X