有可能xslt转换动态的PHP字符串

时间:2012-07-31 16:44:42

标签: php xml xslt curl xml-parsing

我不知道我是否会这样做,我有一个cURL脚本从一个feed中提取xml然后在php字符串中包含它$ rawdata数据看起来像...

<search>
    <response status="1">
        <errors>
            <number_of_hotels>1 of 1</number_of_hotels>
        </errors>
    </response>
    <lr_rates>
        <hotel>
            <hotel_ref>142680</hotel_ref>
            <hotel_currency>GBP</hotel_currency>
            <hotel_rooms>
                <room>
                    <ref>4380316</ref>
                    <type>10</type>
                    <type_description>Apartment</type_description>
                    <sleeps>2</sleeps>
                    <rooms_available>0</rooms_available>
                    <adults>2</adults>
                    <children>0</children>
                    <breakfast>false</breakfast>
                    <dinner>false</dinner>
                    <description>The apartment has seperate kitchen area, lounge/dining area, bedroom with double bed and bathroom with bath &amp; shower.</description>
                    <alternate_description/>
                    <rack_rate>140.00</rack_rate>
                    <rate>
                        <date>31/07/2012</date>
                        <formatted_date>31 July 2012</formatted_date>
                        <price>Full</price>
                        <hotelcurrencyprice>Full</hotelcurrencyprice>
                        <numeric_price>Full</numeric_price>
                        <numeric_hotelcurrencyprice>Full</numeric_hotelcurrencyprice>
                        <requested_currency>GBP</requested_currency>
                    </rate>
                    <rate>
                        <date>01/08/2012</date>
                        <formatted_date>01 August 2012</formatted_date>
                        <price>Full</price>
                        <hotelcurrencyprice>Full</hotelcurrencyprice>
                        <numeric_price>Full</numeric_price>
                        <numeric_hotelcurrencyprice>Full</numeric_hotelcurrencyprice>
                        <requested_currency>GBP</requested_currency>
                    </rate>
                    <available_online>false</available_online>
                    <minimum_nights>1</minimum_nights>
                    <bed_type>Double</bed_type>
                    <cancellation_policy/>
                    <cancellation_days/>
                    <cancellation_hours/>
                    <room_terms/>
                </room>
                <room>
                    <ref>4383781</ref>
                    <type>10</type>
                    <type_description>Apartment</type_description>
                    <sleeps>4</sleeps>
                    <rooms_available>0</rooms_available>
                    <adults>4</adults>
                    <children>0</children>
                    <breakfast>false</breakfast>
                    <dinner>false</dinner>
                    <description>The apartment has seperate kitchen area, lounge with dining area, two double bedrooms, ensuite &amp; main bathroom.</description>
                    <alternate_description/>
                    <rack_rate>185.00</rack_rate>
                    <rate>
                        <date>31/07/2012</date>
                        <formatted_date>31 July 2012</formatted_date>
                        <price>Full</price>
                        <hotelcurrencyprice>Full</hotelcurrencyprice>
                        <numeric_price>Full</numeric_price>
                        <numeric_hotelcurrencyprice>Full</numeric_hotelcurrencyprice>
                        <requested_currency>GBP</requested_currency>
                    </rate>
                    <rate>
                        <date>01/08/2012</date>
                        <formatted_date>01 August 2012</formatted_date>
                        <price>Full</price>
                        <hotelcurrencyprice>Full</hotelcurrencyprice>
                        <numeric_price>Full</numeric_price>
                        <numeric_hotelcurrencyprice>Full</numeric_hotelcurrencyprice>
                        <requested_currency>GBP</requested_currency>
                    </rate>
                    <available_online>false</available_online>
                    <minimum_nights>1</minimum_nights>
                    <bed_type/>
                    <cancellation_policy/>
                    <cancellation_days/>
                    <cancellation_hours/>
                    <room_terms/>
                </room>
            </hotel_rooms>
            <cancellation_type>First Night Stay Chargeable</cancellation_type>
            <cancellation_policy>1 Days Prior to Arrival</cancellation_policy>
            <citytax>
                <typename/>
                <value/>
                <optedin/>
                <iscitytaxarea/>
            </citytax>
        </hotel>
    </lr_rates>
</search>

有多个价格实例我需要传递回php的其他信息,如果可能的话........... ..............好,所以答案是肯定有可能,但现在我卡住试图让xsl输出房间数据所以这就是我如何让它工作到达获取点输出首先我不得不重建我的PHP安装包括xsl,然后使用这个PHP来调用它:

  $ch = curl_init();
  $timeout = 0;
  curl_setopt ($ch, CURLOPT_URL, $url1);
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
  $rawdata = curl_exec($ch);
  curl_close($ch);
    $xml = new DOMDocument();
    $xml->$rawdata;
   $xsl = new DOMDocument;
   $xsl->load('path/to/file.xsl');
   $proc = new XSLTProcessor();
   $proc->importStyleSheet($xsl);
  $lrdata = $proc->transformToXML($xml);

现在一切正常但我不能让我的xslt从每个房间节点拉取数据我已经尝试更改匹配并选择值但没有运气我在这里做错了假设xml与上面相同这是XSL:

 <?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
      <h2> Availability Search:</h2>
       <table border="1">
       <tr bgcolor="#FFFFFF">
        <th align="left">Room Type</th>
        <th align="left">Description</th>
        <th align="left">Availability</th>
        <th align="left">Price</th>
        </tr>
      <xsl:for-each select="/room">
       <tr>
        <td><xsl:value-of select="type_description" /></td>
        <td><xsl:value-of select="description" /></td>
        <td><xsl:value-of select="rooms_available" /></td>
        <td><xsl:value-of select="rack_rate" /></td>
      </tr>
     </xsl:for-each>
  </table>
  </xsl:template>
  </xsl:stylesheet>

抱歉混淆所以现在我需要知道这个xsl有什么问题,如果有可能将信息作为$ string传递回php

2 个答案:

答案 0 :(得分:1)

您的xsl:for-each选择需要阅读:

<xsl:for-each select='//room'>

原因是/ room会在主级别上寻找一个房间(并且在XML中只能有1个),但是// room会查找XML树中任何级别的所有房间元素。

完整的XSL :(你也错过了xsl:output指令)

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method='html' />
       <xsl:template match="/">
          <h2> Availability Search:</h2>
           <table border="1">
           <tr bgcolor="#FFFFFF">
            <th align="left">Room Type</th>
            <th align="left">Description</th>
            <th align="left">Availability</th>
            <th align="left">Price</th>
            </tr>
          <xsl:for-each select="//room">
           <tr>
            <td><xsl:value-of select="type_description" /></td>
            <td><xsl:value-of select="description" /></td>
            <td><xsl:value-of select="rooms_available" /></td>
            <td><xsl:value-of select="rack_rate" /></td>
          </tr>
         </xsl:for-each>
      </table>
      </xsl:template>
    </xsl:stylesheet>

从您的示例中生成2行

答案 1 :(得分:1)

我设法让这个工作到底正确的答案是,我正在使用dom我应该使用simplexmlelement在xml进入的卷曲之后创建一个XML,感谢您的帮助

curl_setopt ($ch, CURLOPT_URL, $url1);
 curl_setopt($ch, CURLOPT_HEADER, 0);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $urlstring);
    $rawdata = curl_exec($ch);
    curl_close($ch);
  $lrxml = new SimpleXMLElement($rawdata);
 $xsl = new DOMDocument;
$xsl->load('path/to/file.xsl');
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl);
$lrdata = $proc->transformToXML($lrxml);
相关问题