0

PHP でメソッド チェーン を実行するのは簡単です。しかし、私はこのようなものが必要です、

$xml = $dom->transformToThis('file1.xsl')->transformToThis('file2.xsl')->saveXML();

また

$books = $dom->
    transformToThis('file1.xsl')->
    transformToThis('file2.xsl')->
    getElementsByTagName('book');

PHP のDOMDocumentまたは DOMNodeで可能ですか?


  class DOMxx extends DOMDocument {

     public function __construct() {
          parent::__construct("1.0", "UTF-8");
     }

     function trasformToThis($xslfile) {
        $xsldom = new DOMDocument('1.0', 'UTF-8');
        $xsldom->load($xslfile);

        $xproc = new XSLTProcessor();
        $xproc->importStylesheet($xsldom);

        $this = $xproc->transformToDoc($this);  // ERROR!
        return $this; 
      }
  } // class

はPHP では無効な構文であり、こちらで説明され$this = Xている回避策がわかりません。のようなものを使用できますが、それは大きな過負荷であり、問​​題は正しいことを行う方法です。$this->loadXML( $xproc->transformToDoc($this)->saveXML() );

実装しようとする別の(間違った)方法、

     function trasformToThis($xslfile) {
        ... same ...
        return  $xproc->transformToDoc($this);  // lost trasformToThis() method
      }

したがって、この場合の質問は「DOMxx にキャストする方法は?」です。

4

2 に答える 2

2

このようなものはどうですか:

class DOMxx {
  function __construct($version = '1.0', $encoding = 'UTF-8') {
    $this->document = new DOMDocument($version, $encoding);
  }                                                 

  function __call($name, $args) {
    $callback = array($this->document, $name);
    return call_user_func_array($callback, $args);
  }

  function transformToThis($xslfile) {
    $xsldom = new DOMDocument('1.0', 'UTF-8');
    $xsldom->load($xslfile);

    $xproc = new XSLTProcessor();
    $xproc->importStylesheet($xsldom);

    $this->document = $xproc->transformToDoc($this->document);
    return $this; 
  }
}

から拡張する代わりに、クラス内のオブジェクトDOMDocumentへの内部参照を保持します。メソッドの大部分は、メソッドを介してこの内部オブジェクトに転送されます。メソッドは、呼び出しから返された新しいドキュメントで参照を更新するだけです。DOMDocumentDOMxx__calltransformToThistransformToDoc

于 2013-07-20T18:58:34.210 に答える
0

transformToThis()元のオブジェクトを変更する必要がある明確な要件はありますか? 次のようなことをした方がきれいだと思います:

function trasform($xslfile) {
    $xsldom = new DOMDocument('1.0', 'UTF-8');
    $xsldom->load($xslfile);

    $xproc = new XSLTProcessor();
    $xproc->importStylesheet($xsldom);

    $xml = $xproc->transformToXML($this);
    $newDom = new DOMxx();
    $newDom.loadXML($xml);
    return $newDom; 
  }

元のオブジェクトを本当に変更したい場合は、これも機能すると思います (メソッドの最後の部分)。

    $xml = $xproc->transformToXML($this);
    $this.loadXML($xml);
    return $this; 
于 2013-07-18T03:41:49.900 に答える