Question

J'essaie d'utiliser la classe Macromedia XSLTransform pour convertir le code XML renvoyé par Amazon Web Services au format HTML. Voici la page PHP qui appelle la transformation:

<?php
require_once('includes/MM_XSLTransform/MM_XSLTransform.class.php'); 

$restquery = "http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=[myid]&Operation=ItemLookup&ResponseGroup=Large&ItemId=" . htmlspecialchars($_GET["asin"]);
$mm_xsl = new MM_XSLTransform();
$mm_xsl->setXML($restquery);
$mm_xsl->setXSL("aws1.xsl");
echo $mm_xsl->Transform();
?>

Et voici un extrait de la page aws1.xsl

<?xml version="1.0"?>
<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2006-06-07">

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

  <xsl:template match="aws:Item">
    <html>
      <body>
        <table>
          <tr>
            <td style="border-bottom:#C0C0C0 dotted 1px;padding:10px">
              <table cellpadding="0" cellspacing="0" style="width: 90%;padding:5px">
                <tr>
                  <xsl:if test="aws:SmallImage/aws:URL">
                    <td valign="top" width="50">
                      <img>
                        <xsl:attribute name="src">
                          <xsl:value-of select="aws:SmallImage/aws:URL" disable-output-escaping="yes" />
                        </xsl:attribute>
                        <xsl:attribute name="border">0</xsl:attribute>
                      </img>
                    </td>
                  </xsl:if>
                  <!-- bunch of other stuff -->
                </tr>
              </table>
            </td>
          </tr>
        </table>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

Le code de base fonctionne. Je récupère les données relatives à l'élément ASIN attendu. Et je sais que le XSL fonctionne fondamentalement parce que si je mets intentionnellement un attribut invalide dans je reçois une erreur d'analyse. Mais ce que je récupère, c'est un gros paquet de texte non formaté au lieu de HTML. J'ai essayé diverses options <xsl:output method>, mais aucune ne semble fonctionner. Je pense que c'est une sorte de problème d'encodage ou de jeu de caractères.

Était-ce utile?

La solution

Vous devez créer une règle correspondant à " / " ou XSL en générera implicitement un pour vous en fonction d'une conversion de l'arbre du document en texte.

Je voudrais réécrire le XSL dans ceci:

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:aws="http://webservices.amazon.com/AWSECommerceService/2006-06-07">

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

  <xsl:template match="/">
    <html>
      <head>...</head>
      <body>
        <table>
          <thead>...</thead>
          <tbody>
            <xsl:apply-templates select="//aws:Item"/>
          </tbody>
        </table>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="aws:Item">
    <tr>
      <td>...</td>
    </tr>
  </xsl:template>

</xsl:stylesheet>

OU ajoutez ce modèle à votre fichier xsl existant

<xsl:template match="*|@*">
<xsl:apply-templates select="*|@*"/>
</xsl:template>

Les deux modèles correspondraient à la racine du document (" / "), qui est la SEULE correspondance implicite que fait XSL. Cette première ferait & Quot; / & Quot; mappez-la sur la balise html, ce qui créerait une table dans laquelle chaque ligne de la table sera mappée sur aws: item. La seconde correspond à tous les noeuds (et attributs), ne génère rien et tente ensuite de faire correspondre tous les enfants. La première est préférable si vous souhaitez uniquement traiter aws: Item, la seconde est préférable si vous souhaitez traiter tous les nœuds. La seconde peut (en fonction des fonctionnalités d’optimisation de votre processeur xslt et de votre document xslt particulier) prendre beaucoup plus de temps à traiter.

Autres conseils

Définissez votre type de contenu pour indiquer que vous envoyez du HTML au lieu de XML.

header('Content-type: text/html');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top