• 締切済み

PHP初心者です。

PHP初心者です。 楽天APIを利用し、PHPでパラメータを作成、以下のスクリプトでxslファイルを呼び出しHTMLに成形しました。 (developerIdとaffiliateIdは架空のものです) ---------------------------------------------------------------------------------- <?php $developerId = '1234567891234567891234567891234'; $affiliateId = '12345678912345678912345678912345'; function urlencode_rfc3986($str) { return str_replace('%7E', '~', rawurlencode($str)); } $baseurl = 'http://api.rakuten.co.jp/rws/2.0/rest'; $params = array(); $params['developerId'] =$developerId; $params['affiliateId'] = $affiliateId; $params['version'] = '2009-04-15'; $params['operation'] = 'ItemSearch'; $params['hits'] = '30'; $params['Keywords'] = '××'; $params['page'] = '1'; $params['minPrice'] = '1000'; $params['maxPrice'] = '5000'; $params['availability'] = '1'; $params['imageFlag'] = '0'; $params['genreId'] = '100026'; foreach ($params as $key => $value) { $api .= '&'.$key.'='.$value; } $url = $baseurl.'?'.$api; ?> <?php $xml = new DomDocument(); $xml->load($url); $xsl = new DomDocument(); $xsl->load('item.xsl'); $processor = new xsltprocessor(); $processor->importStyleSheet($xsl); echo $processor->transformToXML($xml); ?> ---------------------------------------------------------------------------------- これをphp includeで別のHTMLファイルに呼び出したところ、成形されたHTMLタグの一番上に、 truetruetruetruetruetruetruetruetruetruetruetrueSuccess158711130300100 という文字列が返されます(最後の数字はアクセスするたびに変わります)。 この文字を表示させないためにはどのような構文にすればいいのでしょうか。 ご示唆をお願いします。

みんなの回答

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

htmlもxmlもxslも提示されてないので、どの様に出力されればいいのか解りませんが、 受け取ったxmlデータに対して、出力法を指定したxslが不適切ということでしょう。 phpから出力された、ページのhtmlソースを確認してxsl書式を再検討してください。

pop_style
質問者

補足

お手数かけます。再度の回答ありがとうございます。 文字数制限の関係でHTMLとxslの両方を提示することができないので、以下にxslの内容を付記します。 ---------------------------------------------------------------------- <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="UTF-8" omit-xml-declaration="no" indent="yes" /> <xsl:template match="/itemSearch"> <xsl:apply-templates select="Items/Item" /> </xsl:template> <xsl:template match="Items/Item"> <div class="rakuten-item"> <table class="rakuten-itemtitle"> <tr> <td> <h3> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="affiliateUrl" /> </xsl:attribute> <xsl:value-of select="itemName" /> </xsl:element> </h3> </td> </tr> </table> <table> <tr> <td class="itemimage"><xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="affiliateUrl" /> </xsl:attribute> <xsl:element name="img"> <xsl:attribute name="src"> <xsl:value-of select="mediumImageUrl" /> </xsl:attribute> <xsl:attribute name="alt"> <xsl:value-of select="itemName" /> </xsl:attribute> </xsl:element> </xsl:element> </td> <td class="rakuten-itemchaption"> <h4><xsl:value-of select="shopName" /></h4> <h5><xsl:value-of select="itemPrice" />円</h5> <p><xsl:value-of select="itemCaption" />……</p> </td> </tr> </table> </div> <br clear="both" /> </xsl:template> </xsl:stylesheet> ---------------------------------------------------------------------- XMLやXSLTは最近かじりはじめたので、まだまだ不勉強です。 xslファイルに何か問題があるのではないかとのことですので、こちらのことをもう少し勉強してみます。 度々の解答、本当にありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

echo してるから、受け取った内容を表示しているだけ きちんと受け取れてることが解ったら、echo 文をコメントアウトすれば、表示されなくなる。

pop_style
質問者

補足

回答ありがとうございます。 自分も最初、それを疑ってたんですが、最終列の echo $processor->transformToXML($xml); の部分をコメントアウトしてしまうと、APIの結果自体を返してくれなくなります。HTML表示させても、ソースを表示させても真っ白です。phpファイルを直接読み込んでも何も表示されなくなります。 同じ書き方でもAmazon Product Advertising API では問題の個所は表示されず、普通に結果が返ってきているので、それで途方に暮れている次第です。 また何かお気づきの点がありましたら、ご示唆をお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPでXMLを表示させたときの外部エンティティの挙動に関して

    XML+XSLでHTMLを生成する上で、PHPを経由する場合と、しない場合で、 外部エンティティの挙動が異なっていて悩んでいます。 具体的には、  ・XML+XSL+外部エンティティ → 意図通りHTML生成  ・PHP+XML+XSL+外部エンティティ → 意図通りHTML生成されない(外部エンティティが生成されない) こういうものなのでしょうか? もし、こういう仕様であれば、なにか対応策はあるのでしょうか? ソースと生成されたHTMLは下記の通りです。 【Though.php】 <?php header( 'Content-Type: text/html; charset=UTF-8' ); $xml = new DomDocument(); $xml->load( 'MainData.xml' ); $xsl = new DomDocument(); $xsl->load('Main.xsl'); $processor = new xsltprocessor(); $processor->importStyleSheet($xsl); echo $processor->transformToXML($xml); ?> 【MainData.xml】 <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="Main.xsl" ?> <!DOCTYPE books [ <!ENTITY sub_data SYSTEM "SubData.xml"> ]> <root> <node1>TEST1</node1> <node2>&sub_data;</node2> </root> 【Main.xsl】 <?xml version = "1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <xsl:apply-templates /> </html> </xsl:template> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates /> </xsl:copy> </xsl:template> </xsl:stylesheet> 【SubData.xml】 <?xml version="1.0" encoding="utf-8"?> <sub_data>Test2</sub_data> 【XML+XSL+外部エンティティで生成されるHTML(ブラウザで直接MainData.xmlを開いた場合)】 <html><?xml-stylesheet type="text/xsl" href="Main.xsl" ><root><node1>TEST1</node1><node2><sub_data>Test2</sub_data></node2></root></html> 【PHP+XML+XSL+外部エンティティで生成されるHTML(ブラウザでThrough.phpを開いた場合)】 <html> <?xml-stylesheet type="text/xsl" href="Main.xsl" ><root> <node1>TEST1</node1> <node2></node2>    //←node2の中がカラッポになっている。。。 </root> </html> ※生成されたHTMLは、IE8の開発者ツールで確認しています。 XMLやPHPは最近やり始めたのでトンチンカンなことを言ってるかもしれませんが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • [PHP+XML]PHPで動的に出力するXMLをどのようにして読み込めばいいでしょうか?

    こんにちは、どうしても解決ができなくて困っています。 お助け願います。 DBからデータを取得し成形するなどした結果をXMLで出力できるようにPHPを用意しました。 ブラウザから確認でき、XMLをソース表示しても問題ありません。 次にこれを読み込むPHPを書いています。 simplexml_load_fileなどでXMLファイルを開くことはこれまでにもやっていたので、直接XMLファイル名を記述するところに用意したPHPを指定しました。 結果はエラー。 いろいろ検証した結果、PHPがアクションする前にPHPファイルが開かれてしまっている感じ。 DOMDocumentのload()やloadXML()で読み込む方法もトライしましたが結果は同じ・・・。 根本的に間違ってますか? PHPから吐き出されるXMLを読み込むためにXMLファイルを記述するところにPHPスクリプトを指定すること自体が間違っているようにも思っています。 お手数をお掛けいたしますがお教え願います。

    • ベストアンサー
    • PHP
  • PHPのDOMでXML読み込もうとしているのですが...

    PHPのDOMでXML読み込もうとしているのですが、getElementsByTagNameがうまくいきません。 PHPのバージョンは5です。 コードは以下のとうりです。 $document = new DomDocument('1.0'); $document -> Load('test.xml'); $items = $document -> getElementsByTagName('item'); if(!is_null( $items)){ echo count($items); echo "ok"; } XMLにitemノードは3つあるので、 echo count($items); で 3が返ってくると思うのですが、1しか返ってきません。 $items -> value でも何も表示されません。 でも cho "ok"; の ok は表示されます。 すみません。どなたかどこが間違っているのか教えていただけると助かります。

    • ベストアンサー
    • PHP
  • Ajax.Updaterでjavascriptを記述する方法

    お世話になります。 prototype.jsを使って開発をしております。 Ajax.UpdaterにevalScripts: trueを設定し request.responseTextにjavascriptが記述されたものを返しているのですが javascriptに<(小なり)、>(大なり)があると &gt;&ltに変換されてしまい、javascriptが正常に動作しません。 なければ正常に動作します。 恐らくはrequest.responseTextに返す前にPHPで $xsl = new DomDocument(); $xsl->load("hoge.xsl"); $processor = new xsltprocessor(); $processor->importStyleSheet($xsl); echo $processor->transformToXML($xml); とパースをかけていることが原因だと思うのですが 何か対処法はありませんでしょうか? どうぞよろしくお願い致します。 xslに書いてあるjavascriptの内容 <script language="javascript" type="text/javascript"> // <![CDATA[ test = function(hoge){ if(hoge > 3){ alert("over"); } }; // ]]> </script> http://oshiete1.goo.ne.jp/kotaeru.php3?q=1875880 を参考にCDATAをscriptの中に書いたり、外に書いたりと試しましたが ダメでした。当然か。。。 <script type="text/javascript" src="./hoge.js"></script> という風に外部ファイルとしてなら恐らく上手くいくと思うのですが・・・。

  • 教えてください><

    JavaScriptを使って XSLTに変数(key)を渡し、XMLをHTMLに変換 その結果を表示したいと思っています。 しかし、うまく表示してくれません。 XSLTをXMLに変換してHTMLするところに関しては正常に動いているので、 おそらくJavaScriptに問題があると思います。 どこがおかしいか教えていただけないでしょうか? 以下ソース <html> <head> <title>好きな本 </title> </head> <body onLoad="load()"> <script type="text/javascript"> var xml, xslt, xslProc; function load() { // 読み込む前に空のドキュメントを生成 if(!document.all) { // ブラウザ判別 // Mozilla xml = document.implementation.createDocument("", "", null); xslt = document.implementation.createDocument("", "", null); } else { // Internet Explorer xml = new ActiveXObject("Msxml2.DOMDocument"); xml.async = false; xslt = new ActiveXObject("Msxml2.FreeThreadedDOMDocument"); xslt.async = false; } // 読み込み(*.xml,*.xsl) xml.load("xmldata.xml"); xslt.load("seiseiform.xsl"); // XSLTプロセッサにスタイルシート(*.xsl)をセット if(!document.all) { // ブラウザ判別 // Mozilla xslProc = new XSLTProcessor(); xslProc.importStylesheet(xslt); } else { // Internet Explorer var xslTemp = new ActiveXObject("Msxml2.XSLTemplate"); xslTemp.stylesheet = xslt; xslProc = xslTemp.createProcessor(); xslProc.input = xml; } } function transform(in) { // XSLTプロセッサにパラメータを与えて変換、結果はresult要素に if(!document.all) { // ブラウザ判別 // Mozilla xslProc.setParameter(null, "key", in); var fragment = xslProc.transformToFragment(xml, document); document.getElementById('result').innerHTML = ""; document.getElementById('result').appendChild(fragment); } else { // Internet Explorer xslProc.addParameter("key",in); try { xslProc.transform; document.getElementById('result').innerHTML = xslProc.output; } catch(e) { document.getElementById('result').innerHTML = e.description; } } } </script> <form> <p><input type="text" name="in" size="40"/></p> <br></br> <p><input type="submit" value="検索" onClick="transform(in.value)"/> </p> </form> <div id="result"></div> </body> </html>

  • phpでサイト構築していて困っています

    ホットペッパーAPIを使ってサイトを作っています。まだ知識が浅く分からないことが多いのですが、下記について教えて下さい。 <?php //サイト設定 $site['title'] = "APIサンプルサイト"; $site['url'] = "http://●●.jp"; $site['mojicode'] = "Shift_JIS"; $site['info'] = "ホットペッパービューティーAPIのサンプルです"; //XMLデータ取得用ベースURL $req = "http://webservice.recruit.co.jp/beauty/salon/v1/"; //リクエストパラメータ設定 $name = "◎◎"; $name_kana = "××"; //XMLデータ取得用リクエストURL生成 $req .= "?name=".$name."&name_kana=".$name_kana; $xml = simplexml_load_file($req) or die("XMLパースエラー"); //HTML出力 echo <<<HTML <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>{$site['title']}</title> </head> <body> <h1>{$site['title']}</h1> <hr> {$site['info']} <hr> {$xml->salon->name}<br> {$xml->salon->name_kana}<br> </body> </html> HTML; ?> ------------------------------------ (APIキーを省略しています) 上記の様に作成したページに <?php include_once '../include/commons.php'; ?> を入れて別のphpファイルを参照したいのですが、どこに入れれば良いのでしょうか??もしくはこの文章を入れることはできないのでしょうか。 最終的に「../include/commons.php」を参照(読み込み?)できれば良いので、方法を教えて下さい。 昨日からずっと入れる場所をいろいろ変えて試してみましたが、うまくいきません。APIがからんでない別のphp文書の文頭に入れると動作するのですが・・。 質問の仕方が未熟で申し訳ありませんが、宜しくお願いします。

    • ベストアンサー
    • PHP
  • PHP5 domDocumentで簡単に深いノードを取得する。但し、SimpleXMLを使わない

    環境はPHP5です。 SimpleXML(simplexml_load_file)を使わない事情がありまして、domDocumentを使っています。 $dom = new domDocument(); $dom->load("example.xml"); $root = $dom->documentElement; foreach($root->childNodes as $elems) { if ($elems->nodeType == XML_ELEMENT_NODE && $elems->nodeName == "Items") { ... ... ... 例えば以下のようなXMLの場合、<D2>のyyyyyを取得する為に上のプログラムだと、 foreach, ifのネストが深くなり、階層が深くなるにつれてプログラムの記述も増えて 非常に面倒ですが、$rootを使って、yyyyyの値を1行程度で取得する方法ないのでしょうか? <A> <Items> <B1></B1> <B2> <C> <D1>xxxxx</D1> <D2>yyyyy</D2> </C> </B2> <B3></B3> </Items> </A>

    • ベストアンサー
    • PHP
  • xmlからphpで出力したデータをソートするアンカーを設けたい

    phpを使用し、WEBサービスで情報を取得して、foreachでデータを表示しています。 表示したデータについて、たとえばアマゾンのWEBサービスであれば、「価格でソート」、という文言をいれ、 それをクリックすると、ソートされる、という風にしたいと思っています。 <?php $url = "http://~~~~~~"; $params = "?~~~~~ $data = file_get_contents($url . $params); $data = str_replace(~~~,~~~, $data); $xml = simplexml_load_string($data); foreach ($xml->AAA as $aaa) { echo $aaa->ABC . "<br>"; echo $aaa->BBB->Price . "<br>"; } ?> というソースですが、「Priceでソート」というクリック可能なアンカーを挿入したいとき、どこにどのように書けばいいのでしょうか? asort、array_multisort とかを使えばいい、というところまで調べていますが、行き詰っています。 また、手法としては、 (1)取得したxmlデータを保持して、並べ替えるだけ (2)前述のソースを再利用し、再度xmlを取得しなおし、ただしそのときにソートの条件を付け加える のどちらかになるのでしょうか。

    • 締切済み
    • PHP
  • PHPでXMLの置換 replaceData

    PHPのXML操作で、すでにあるXMLの置換をしたいと思っています。 $doc=DOMDocument::load('test.xml'); $hoge=$doc->getElementsByTagName('hoge')->item(0)->firstChild; $hoge->replaceData(0,1000,$_POST['hogehoge']); このような感じで置換はできるのですが、 中身が空の場合は置換できずにエラーになってしまいます。 単純にappendDataやinsertDataにすればいいのかと思ったのですが それでもエラーになってしまいます。 こういう場合はどういう対処をすればいいのでしょうか? そもそも空というのがあるのはいけないのでしょうか・・・? どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPでXMLデータ生成、スキーマで失敗

    PHPのDOMDocumentを使ってXMLデータを生成しています。 $dom->schemaValidate('xsdファイル'); で失敗してしまします。 どうしても原因がわからないので吐き出すデータを最小限にして試してみましたが状況が変わりませんでした。 スキーマは以下のようになっています。 <?xml version="1.0" encoding="Shift_JIS" ?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Response"> <xsd:complexType> <xsd:sequence> <xsd:element name="user" type="user_type" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="user_type"> <xsd:sequence> <xsd:element name="developerID" type="xsd:string" /> <xsd:element name="operation" type="xsd:string" /> <xsd:element name="User-Agent" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> そして吐き出されるxml形式のデータは、 <?xml version="1.0" encoding="Shift-JIS"?> <Response> <user> <developerID>testdeveloperID</developerID> <operation>testoperation</operation> <User-Agent>Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1</User-Agent> </user> </Response> 出てしまうエラーは、 Warning: DOMDocument::schemaValidate() [<a href='domdocument.schemavalidate'>domdocument.schemavalidate</a>]: The document has no document element. in "実行しているphpファイルのパス" on line 12 ちなみに実行phpの12行目には、 $dom->schemaValidate('xsdファイル'); があります。 スキーマを使用してのxmlデータ吐き出しは初めてなのでいろいろと戸惑っています。 何か解決方法もしくはエラーが出てしまう原因をご存知の方がいらっしゃいましたらアドバイスをいただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • XML
このQ&Aのポイント
  • 【DCP-J926N】のソフトウェアアップデートでエラーメッセージが表示される件について
  • 【Windows7】の環境で【無線LAN】接続している状況でソフトウェアアップデートを行うと、【添付1】および【添付2】のエラーメッセージが表示されます。
  • 最新版のソフトウェアにアップデートする方法を教えていただけますか?プリンターはすでに最新版にアップデートされています。
回答を見る