使用PHP将XML数据显示为HTML
我希望有人能帮我我在这件事上有一阵子没办法了 我是一个分支机构,我从提供的服务中获取xml数据。我正在尝试转换这些数据并在我的网站上显示为html 我已经测试了xsl,并且可以确认xsl是否按照我的要求显示数据 我的问题是,从urla提取数据并使用xsl转换数据以显示html的php代码不起作用使用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
<?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>