通过PHP在HTML中使用XSL模板 - 正确的方法

时间:2016-06-09 12:26:15

标签: php html xml xslt

我有一个XML feed(feefo),我希望将其合并到现有的网页中。我有feed,我有一个xsl文件,以及一个调用转换过程的供应商php文件。我在我的html中使用以下内容来包含供应商php文件:

<?php include('feefo/feefofeedback-v2.php') ?>
像这样的脚本供应商php文件:

<?php
$curdir = getcwd();

$merchantidentifier = array_key_exists('merchantidentifier', $_GET) ? $_GET['merchantidentifier'] : 'smartmoneyonline';
$limit = array_key_exists('limit', $_GET) ? $_GET['limit'] : null;
$mode = array_key_exists('mode', $_GET) ? $_GET['mode'] : null;
$vendorref = array_key_exists('vendorref', $_GET) ? $_GET['vendorref'] : null;
$suppressnegatives = array_key_exists('suppressnegatives', $_GET) ? $_GET['suppressnegatives'] : null;

$xml_filename = "http://cdn2.feefo.com/api/xmlfeedback?merchantidentifier=".$merchantidentifier;
if ($limit)
  $xml_filename .= "&limit=".$limit;
if ($vendorref)
  $xml_filename.="&vendorref=".$vendorref; 
if ($mode)
  $xml_filename.="&mode=".$mode; 
if ($suppressnegatives)
  $xml_filename.="&negativesanswered=true";

if (phpversion() < "5"){
  $xmldoc = domxml_open_file( $xml_filename);
  $xsldoc = domxml_xslt_stylesheet_file ( $curdir."/feefo/feedback.xsl");
  $result = $xsldoc->process($xmldoc);
  echo $result->dump_mem();
}
else
{
  $doc = new DOMDocument();
  $xsl = new XSLTProcessor();
  $doc->load($curdir."/feefo/feedback.xsl");
  $xsl->importStyleSheet($doc);
  $doc->load($xml_filename);
  echo $xsl->transformToXML($doc);
}

?>

虽然它有效,但我不确定我是否正确实现了这个,因为xsl文件包含html,head,body等。这是xsl文件的开头:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<?xml-stylesheet type="text/css" href="style.css"?>
 <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:variable name="feefostarsimageroot" select="'http://cdn.feefo.com/feefo/resources/images/rating'" />
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>FeeFo Feedback</title>
    <link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
  <div id="page" itemtype="http://schema.org/LocalBusiness" itemscope="itemscope">
 <!-- tr class=row -->
       <div class="comments">

           <xsl:for-each select="FEEDBACKLIST/SUMMARY">
               <h1><span itemprop="name">......

显然页面没有验证,因为我有父html,head,body元素,以及xsl文件中包含的那些元素。如果我删除了xsl文件中的那些元素,那么xml feed将不再有效:

  

消息:DOMDocument :: load():未定义for-each的命名空间前缀xsl

我是否以正确的方式接近了这个?如果是这样,我如何从xsl文件中删除有问题的元素并仍然可以使用它?

1 个答案:

答案 0 :(得分:0)

使用

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/>

<xsl:variable name="feefostarsimageroot" select="'http://cdn.feefo.com/feefo/resources/images/rating'" />

<xsl:template match="/">
  <div id="page" itemtype="http://schema.org/LocalBusiness" itemscope="itemscope">
 <!-- tr class=row -->
       <div class="comments">

           <xsl:for-each select="FEEDBACKLIST/SUMMARY">
               <h1><span itemprop="name">......

</xsl:template>
</xsl:stylesheet>

显然<link rel="stylesheet" type="text/css" href="style.css" />是一个问题,因为它属于完整HTML文档的head部分,您需要调整PHP以确保您之前包含的CSS链接代码。