Calender
Sun Mon Tue Wed Thu Fri Sat
    123
45678910
11121314151617
18192021222324
252627282930 
<< November 2018 >>
広告
SEARCH

SELECTED ENTRIES
RECENT COMMENTS
RECENT TRACKBACK
CATEGORIES
ARCHIVES
LINKS
PROFILE
OTHERS
SKYPE
PC: skype.jojo.jp
chat
iPad: iphone.jojo.jp
chat call
THANKS



本日:
昨日:
多言語
広告
 ▼▲ 作業日報 ▼△
    What's under the hood?
<< ignore_user_abort(false)でPHPが処理を中断しない件 | main | XSLでのXHTML出力時のSCRIPT、TEXTAREAタグ >>
PHPのヒアドキュメント、$文字に注意
 PHP文中にXSL等のヒアドキュメントを利用する際に$(ダラー記号)があるとPHPは変数とし解釈しますが、、XSLの構文ばかりに気がいっていて、スッカリ忘れていました。おかげで半日近くロスショック
 下の例では、XSL変数中のvariableで指定したnoとcolor変数にアクセスするにはXSL変数の$noと$colorですが、これがPHPにより実行時に評価されるため空文字が入っていました、$は¥$とエスケープします

簡単XML-XSLベースCGIサンプル
<?
//定数
define('XMLDEF_SJIS',chr(60).'?xml version="1.0" encoding="Shift_JIS"?'.chr(62));

//フォームのデータ
$xml=<<<__XMLDATA__
<root>
  <item id="バナナ" c="黄色"/>
  <item id="りんご" c="赤"/>
  <item id="みかん" c="黄色"/>
  <item id="パイナップル" c="黄色"/>
  <item id="ぶどう" c="紫"/>
  <item id="イチゴ" c="赤"/>
  <item id="アボガド" c="紫"/>
</root>
__XMLDATA__;

//フォームの定義
$xsl=<<<__XSL__
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="Shift_JIS" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:variable name="no" select="/root/@sel_nakma"/>
<xsl:variable name="color" select="/root/item
[position() = ¥$no]/@c"/>
<html><body>
<form>
<select name="sel_nakama">
<xsl:for-each select="/root/item">
<option>
<xsl:if test="position() = 
¥$no"><xsl:attribute name="selected">selected</xsl:attribute></xsl:if>
<xsl:attribute name="value"><xsl:value-of select="position()"/></xsl:attribute>
<xsl:value-of select="@id"/>
</option>
</xsl:for-each>
</select>
<input type="submit" value="仲間"/>
</form>
<xsl:if test="
¥$no">
<hr/>
--「<xsl:value-of select="
¥$color"/>」の仲間--<br/>
<table border="1">
<xsl:for-each select="/root/item">
<xsl:if test="@c = 
¥$color">
    <tr><td><xsl:value-of select="./@id"/></td></tr>
</xsl:if>
</xsl:for-each>
</table>
</xsl:if>
</body></html>
</xsl:template>
</xsl:stylesheet>
__XSL__;

//DOMの生成
$domData = new DOMDocument('1.0','SJIS');
$domXsl = new DOMDocument('1.0','SJIS');
$domData->loadXMLXMLDEF_SJIS.$xml);
$domXsl->loadXMLXMLDEF_SJIS.$xsl);

//CGI処理
if ($_REQUEST['sel_nakama']) {
    
$domData->firstChild->setAttribute('sel_nakma',$_REQUEST['sel_nakama']);
};

//デバッグ情報の保存(不必要)
$domData->save(basename($_SERVER['SCRIPT_NAME']).'.data.xml');
$domXsl->save(basename($_SERVER['SCRIPT_NAME']).'.form.xml');

//XHTML生成
$xslt = new XSLTProcessor();
$xslt->importStyleSheet$domXsl );
echo 
$xslt->transformToXml$domData );

?>
PHP5以降、ファイル名は何でもよい、SJIS  
| 開発関連 | 10:51 | comments(0) | trackbacks(0) |









http://blog.jojo.jp/trackback/870669