0

用 PHP做方法链 很容易。但我需要这样的东西,

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

或者

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

可以使用 PHP 的DOMDocumentDOMNode吗?


  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

$this = X是 PHP 中的无效构造,我不明白这里解释的解决方法。我可以使用类似的东西,$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 回答