2013-11-18 2 views
2

Я надеюсь, что кто-то может помочь мне, что я застрял на это некоторое время ..Отображение данных XML как HTML с PHP

я филиал, и я получаю XML-данные из предоставленного. Я пытаюсь преобразовать эти данные и отобразить как html на моем сайте.

Я протестировал свой xsl и могу подтвердить, что xsl отображает данные так, как я хотел.

Моя проблема заключается в том, что PHP-код для извлечения данных из urla и преобразования данных с использованием xsl для отображения html не работает.

<?php 


    $context = stream_context_create(array('http' => array('header' => 'Accept: application/xml'))); 

    $url = 'http://merchandising.expediaaffiliate.com/campaign/?campaignId=85413&cid=409870 '; 

    $xml = file_get_contents($url, false, $context); 

    $xml = simplexml_load_string($xml); 

    $doc = new DOMDocument(); 

    $doc->load('http://sitename/hotels.xslt'); 

    $xsl = new XSLTProcessor(); 

    $xsl->importStyleSheet($doc); 

    $doc->load($xml); 

    echo $xsl->transformToXML($doc); 


    ?> 

Мой Xsl ниже:

<?xml version="1.0" encoding="ISO-8859-1"?> 

<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
    <body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE"> 

    <xsl:for-each select="HotelAvailabilityListResults"> 
    <xsl:for-each select="Hotel"> 


     <div style="background-color:teal;color:white;padding:4px"> 
     <span style="font-weight:bold"><xsl:value-of 
    select="name" 
    disable-output-escaping="yes"/></span> 
     - <xsl:value-of select="city"/> 
     </div> 
     <div style="margin-left:20px;margin-bottom:1em;font-size:10pt"> 
     <p><xsl:value-of select="shortDescription" 
    disable-output-escaping="yes"/>. 
     <span style="font-style:italic"> 
      <xsl:value-of select="address1" 
    disable-output-escaping="yes"/> 
     </span>.</p> 
<p> 
     <span style="font-style:italic"> 
     <xsl:element name="img"> 
    <xsl:attribute name="src"> 

    <xsl:value-of select="thumbNailUrl"/> 
    </xsl:attribute> 
    </xsl:element> 
     </span>.</p> 
     </div> 
<span style="font-style:italic"> 
      <xsl:value-of select="HotelProperty/promoDescription" /> 
     </span> 
<span style="font-style:italic"> 
      <xsl:value-of select="ValueAdds/ValueAdd" /> 
     </span> 
<div> 
<span style="font-style:italic"> 
     <xsl:element name="a"> 
    <xsl:attribute name="href"> 

    <xsl:value-of select="hotelUrl"/> 
    </xsl:attribute> 
    </xsl:element> 
     </span> 
</div> 
    </xsl:for-each> 
    </xsl:for-each> 



    </body> 
</html> 
+0

Не могли бы вы подробно объяснить, что _not working_ значит в настройках? –

+0

Если нет веской причины, почему бы не позволить клиенту обработать преобразование? Просто добавьте объявление стилей в XML-'' – Flynn1179

ответ

0

У вас есть две проблемы, сначала XML плохо, описания не CDATA разделы, но текстовые узлы. Похоже, кто-то дважды убежал от него. Чтобы использовать их в XSLT, вам необходимо их восстановить.

$context = stream_context_create(array('http' => array('header' => 'Accept: application/xml'))); 
$url = 'http://merchandising.expediaaffiliate.com/campaign/?campaignId=85413&cid=409870 '; 
$xml = file_get_contents($url, false, $context); 

$xmlDom = new DOMDocument(); 
$xmlDom->loadXml($xml); 

$xpath = new DOMXPath($xmlDom); 

/* repair double escaped cdatas */ 
$translationTable = array_flip(
    get_html_translation_table(HTML_ENTITIES, ENT_QUOTES | ENT_HTML5, 'UTF-8') 
); 
$nodes = $xpath->evaluate('//text()[starts-with(., "<![CDATA[")]'); 
foreach ($nodes as $node) { 
    $fragment = $xmlDom->createCDATASection(
    str_replace(
     array_keys($translationTable), 
     $translationTable, 
     substr($node->nodeValue, 9, -3) 
    ) 
); 
    $node->parentNode->appendChild($fragment); 
    $node->parentNode->removeChild($node); 
} 

$xslDom = new DOMDocument(); 
$xslDom->load('template.xsl'); 

$xsl = new XSLTProcessor(); 
$xsl->importStyleSheet($xslDom); 

echo $xsl->transformToXML($xmlDom); 

Шаблон в вашем вопросе не является таблицей стилей XSLT. Корневым элементом XSLT является таблица стилей. Вам также нужно сопоставить что-то из XML.

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output 
    method="html" 
    encoding="UTF-8" 
    standalone="yes" 
    indent="yes"/> 

    <xsl:template match="/"> 
    <html > 
     <body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE"> 
     <xsl:for-each select="HotelAvailabilityListResults"> 
      <xsl:for-each select="Hotel"> 
      <div style="background-color:teal;color:white;padding:4px"> 
       <span style="font-weight:bold"> 
       <xsl:value-of select="name"/> 
       </span> 
       - <xsl:value-of select="city"/> 
      </div> 
      <div style="margin-left:20px;margin-bottom:1em;font-size:10pt"> 
       <p> 
       <xsl:value-of select="shortDescription" disable-output-escaping="yes"/>. 
       <span style="font-style:italic"> 
        <xsl:value-of select="address1"/> 
       </span> 
       </p> 
       <p> 
       <span style="font-style:italic"> 
        <img src="{thumbNailUrl}"/> 
       </span>. 
       </p> 
      </div> 
      <span style="font-style:italic"> 
       <xsl:value-of select="HotelProperty/promoDescription"/> 
      </span> 
      <span style="font-style:italic"> 
       <xsl:value-of select="ValueAdds/ValueAdd" /> 
      </span> 
      <div> 
       <span style="font-style:italic"> 
       <a href="{hotelUrl}"> 
        <xsl:value-of select="hotelUrl"/> 
       </a> 
       </span> 
      </div> 
      </xsl:for-each> 
     </xsl:for-each> 
     </body> 
    </html> 
    </xsl:template> 

</xsl:stylesheet> 

Некоторые дополнительные советы по использованию XSLT:

  1. Будьте осторожны с disable-out-escaping="yes", это открывает вам до HTML инъекций. Вы должны доверять источнику. Избегайте его, если это возможно.
  2. Вы можете использовать {} внутри значений атрибутов для доступа к Xpath, удаляет много помех от <xsl:element/> и <xsl:attribute/>
Смежные вопросы