使用PHP将XML数据显示为HTML

使用PHP将XML数据显示为HTML,php,xml,xslt,xhtml,affiliate,Php,Xml,Xslt,Xhtml,Affiliate,我希望有人能帮我我在这件事上有一阵子没办法了 我是一个分支机构,我从提供的服务中获取xml数据。我正在尝试转换这些数据并在我的网站上显示为html 我已经测试了xsl,并且可以确认xsl是否按照我的要求显示数据 我的问题是,从urla提取数据并使用xsl转换数据以显示html的php代码不起作用 <?php $context = stream_context_create(array('http' => array('header' => 'Accept: appl

我希望有人能帮我我在这件事上有一阵子没办法了

我是一个分支机构,我从提供的服务中获取xml数据。我正在尝试转换这些数据并在我的网站上显示为html

我已经测试了xsl,并且可以确认xsl是否按照我的要求显示数据

我的问题是,从urla提取数据并使用xsl转换数据以显示html的php代码不起作用

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


    ?>
load('http://sitename/hotels.xslt');
$xsl=新的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>

- 
。


您有两个问题,首先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);
$context=stream\u context\u create(数组('http'=>array('header'=>'Accept:application/xml'));
$url='1http://merchandising.expediaaffiliate.com/campaign/?campaignId=85413&cid=409870 ';
$xml=file\u get\u contents($url,false,$context);
$xmlDom=newdomdocument();
$xmlDom->loadXml($xml);
$xpath=newdomxpath($xmlDom);
/*修复双转义CDATA*/
$translationTable=数组\u翻转(
获取html翻译表(html实体、ENT引号、ENT HTML5、“UTF-8”)
);

$nodes=$xpath->evaluate('//text()[以(,,)开头]您能详细解释一下在您的设置中不工作意味着什么吗?除非有充分的理由,为什么不让客户端处理转换?只需在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>