Нужна помощь в отображении XML как HTML - PullRequest
0 голосов
/ 17 марта 2009

Я пытаюсь использовать класс Macromedia XSLTransform для преобразования XML, возвращаемого из веб-служб Amazon, в HTML. Вот страница PHP, которая вызывает преобразование:

<?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();
?>

А вот фрагмент страницы 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>

Основной код работает - я получаю данные об ожидаемом элементе ASIN. И я знаю, что XSL в основном работает, потому что, если я преднамеренно помещу недопустимый атрибут, я получу ошибку синтаксического анализатора. Но что я получаю, так это большой неформатированный пакет текста вместо HTML. Я пробовал различные варианты <xsl:output method>, но ни один из них не работает. Я думаю, что это какая-то проблема кодирования или кодировки.

Ответы [ 2 ]

1 голос
/ 17 марта 2009

Вам нужно создать правило, соответствующее «/», или XSL будет неявно создавать его для вас на основе преобразования текста в текст документа.

Я бы переписал XSL так:

<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>

ИЛИ добавьте этот шаблон в существующий xsl

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

Оба шаблона будут соответствовать корневому каталогу документа ("/"), который является ЕДИНСТВЕННЫМ неявным соответствием, которое делает XSL. Это сначала заставит "/" отобразить тег html, который создаст таблицу, в которой каждая строка таблицы будет отображена в aws: item. Второй будет соответствовать всем узлам (и атрибутам), ничего не выводить, а затем попытаться сопоставить все дочерние элементы. Первое лучше, если вы хотите обрабатывать только aws: Item, второе лучше, если вы хотите обработать все узлы. Второе может (в зависимости от функций оптимизации вашего процессора xslt и вашего конкретного документа xslt) обрабатываться гораздо дольше.

0 голосов
/ 17 марта 2009

Установите тип содержимого, чтобы указать, что вы отправляете HTML вместо XML.

header('Content-type: text/html');
...