
[code]

    <?php class SitemapGenerator{
        private $sitemap;
        private $urlset = array();
    
        function __construct(){
            $this->sitemap = new DOMDocument('1.0', 'UTF-8');
            $this->sitemap->preserveWhiteSpace = false;
            $this->sitemap->formatOutput = true;
    
            $this->urlset = $this->sitemap->appendChild( $this->sitemap->createElement("urlset") );
            $this->urlset->setAttribute('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9');
        }
    
        function add($params){
            $url = $this->urlset->appendChild( $this->sitemap->createElement('url') );
            foreach($params as $key => $value){
                if(strlen($value)){
                    $url->appendChild( $this->sitemap->createElement($key, $value) );
                }
            }
        }
    
        function generate($file=null){
            if( is_null($file) ) {
                header("Content-Type: text/xml; charset=utf-8");
                echo $this->sitemap->saveXML();
            } else {
                $this->sitemap->save( $file );
            }
        }
    }
    
[/code]

上記のコードですが、xmlの最初の部分を  
`<?xml version="1.0" encoding="UTF-8"?>`のみから、  
`<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type='text/xsl'
href='xsl-stylesheet2.xsl'?>`にしたいと考えています。

どのように修正を行うべきでしょうか。

詳しい方、ご教示下さい。宜しくお願い致します。


CC BY-SA 3.0
2015-12-26T03:54:58.030
20389
2016-01-03T13:48:28.130
2016-01-03T13:48:28.130
8000
8619
question
php dom
DOMDocument に <?xml-stylesheet ... ?> を追加するには？


xml文書では、`<?` ではじまり`?>`で終わる構文のことを処理命令(Processing Instruction)と呼びます。

今回の質問にあるスタイルシートの記述はこの処理命令にあたります。  
DOMDocumentクラスにはあらかじめこの処理命令構文を記述するためのメソッド`createProcessingInstruction`が用意されていますので、こちらを使って実現できるかと思います。

[code]

    function generate($file=null){
        if( is_null($file) ) {
            header("Content-Type: text/xml; charset=utf-8");
    
            /* 処理命令構文の生成 */
            $insertBefore = $this->sitemap->firstChild;  //挿入する部分を取得
            $styleSheetXml = $this->sitemap->createProcessingInstruction('xml-stylesheet', "type='text/xsl' href='xsl-stylesheet2.xsl'"); //Stylesheet処理命令生成
            $this->sitemap->insertBefore($styleSheetXml, $insertBefore); // 指定した場所に挿入
    
            echo $this->sitemap->saveXML();
        } else {
            $this->sitemap->save( $file );
        }
    }
    
[/code]


CC BY-SA 3.0
2016-01-03T00:28:28.067
20550
2016-01-03T00:28:28.067
13097
20389
answer