문제

Macromedia XSLTransform 클래스를 사용하여 Amazon Web Services에서 HTML로 반환 된 XML을 변환하려고합니다. 변환을 호출하는 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> 옵션이지만 아무도 작동하지 않는 것 같습니다. 나는 그것이 일종의 인코딩 또는 숯불 문제라고 생각합니다.

도움이 되었습니까?

해결책

"/"또는 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이하는 유일한 암시 적 일치 인 Document Root ( "/")와 일치합니다. 이것은 먼저 "/"맵을 HTML 태그에 맵핑하여 각 테이블 행이 AWS : Item에 맵핑되는 테이블을 만듭니다. 두 번째는 모든 노드 (및 속성)와 일치하고 출력 아무것도 출력 한 다음 모든 어린이와 일치 시키려고 시도합니다. AWS : 항목 만 처리하려는 경우 첫 번째는 더 좋습니다. 모든 노드를 처리하려면 두 번째는 더 좋습니다. 두 번째는 (XSLT 프로세서의 최적화 기능과 특정 XSLT 문서의 최적화 기능에 따라) 처리하는 데 훨씬 더 오래 걸릴 수 있습니다.

다른 팁

XML 대신 HTML을 보내는 것을 나타내도록 컨텐츠 유형을 설정하십시오.

header('Content-type: text/html');
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top