rrichards               Mon Sep 22 15:08:03 2003 EDT

  Modified files:              
    /php-src/ext/xsl    xsltprocessor.c 
  Log:
  set base href for copied, imported doc
  set environment for imported stylesheet
  add optional clone parameter for data to transform
  
Index: php-src/ext/xsl/xsltprocessor.c
diff -u php-src/ext/xsl/xsltprocessor.c:1.12 php-src/ext/xsl/xsltprocessor.c:1.13
--- php-src/ext/xsl/xsltprocessor.c:1.12        Sun Aug 24 06:18:08 2003
+++ php-src/ext/xsl/xsltprocessor.c     Mon Sep 22 15:07:52 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: xsltprocessor.c,v 1.12 2003/08/24 10:18:08 rrichards Exp $ */
+/* $Id: xsltprocessor.c,v 1.13 2003/09/22 19:07:52 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -128,6 +128,7 @@
        xsltStylesheetPtr sheetp, oldsheetp;
        xsl_object *intern;
        node_object *docobj;
+       int prevSubstValue, prevExtDtdValue;
        
        DOM_GET_THIS(id);
        
@@ -140,8 +141,14 @@
        /* libxslt uses _private, so we must copy the imported 
        stylesheet document otherwise the node proxies will be a mess */
        newdoc = xmlCopyDoc(doc, 1);
+       xmlNodeSetBase((xmlNodePtr) newdoc, (xmlChar *)doc->URL);
 
+       prevSubstValue = xmlSubstituteEntitiesDefault(1);
+       prevExtDtdValue = xmlLoadExtDtdDefaultValue;
+       xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
        sheetp = xsltParseStylesheetDoc(newdoc);
+       xmlSubstituteEntitiesDefault(prevSubstValue);
+       xmlLoadExtDtdDefaultValue = prevExtDtdValue;
 
        if (!sheetp) {
                xmlFreeDoc(newdoc);
@@ -163,7 +170,7 @@
 /* }}} end xsl_xsltprocessor_import_stylesheet */
 
 
-/* {{{ proto xsl_document xsl_xsltprocessor_transform_to_doc(node doc);
+/* {{{ proto xsl_document xsl_xsltprocessor_transform_to_doc(node doc [,boolean 
clone]);
 URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#
 Since: 
 */
@@ -173,7 +180,7 @@
        xmlDoc *doc = NULL;
        xmlDoc *newdocp;
        xsltStylesheetPtr sheetp;
-       int ret;
+       int ret, clone = 0;
        char **params = NULL;
        xsl_object *intern;
        node_object *docobj;
@@ -182,7 +189,7 @@
        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);
        sheetp = (xsltStylesheetPtr) intern->ptr;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|l", &docp, &clone) == 
FAILURE) {
                RETURN_FALSE;
        }
        DOC_GET_OBJ(doc, docp, xmlDocPtr, docobj);
@@ -190,7 +197,14 @@
        if (intern->parameter) {
                params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC);
        }
+
+       if (clone == 1) {
+               doc = xmlCopyDoc(doc, 1);
+       }
        newdocp = xsltApplyStylesheet(sheetp, doc, (const char**) params);
+       if (clone == 1) {
+               xmlFreeDoc(doc);
+       }
 
        if (params) {
                efree(params);
@@ -206,7 +220,7 @@
 /* }}} end xsl_xsltprocessor_transform_to_doc */
 
 
-/* {{{ proto xsl_ xsl_xsltprocessor_transform_to_uri(node doc, string uri);
+/* {{{ proto xsl_ xsl_xsltprocessor_transform_to_uri(node doc, string uri [,boolean 
clone]);
 */
 PHP_FUNCTION(xsl_xsltprocessor_transform_to_uri)
 {
@@ -214,7 +228,7 @@
        xmlDoc *doc = NULL;
        xmlDoc *newdocp;
        xsltStylesheetPtr sheetp;
-       int ret, uri_len;
+       int ret, uri_len, clone = 0;
        char **params = NULL, *uri;
        xsl_object *intern;
        node_object *docobj;
@@ -223,7 +237,7 @@
        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);
        sheetp = (xsltStylesheetPtr) intern->ptr;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "os", &docp, &uri, 
&uri_len) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "os|l", &docp, &uri, 
&uri_len, &clone) == FAILURE) {
                RETURN_FALSE;
        }
 
@@ -232,8 +246,17 @@
        if (intern->parameter) {
                params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC);
        }
+
+       if (clone == 1) {
+               doc = xmlCopyDoc(doc, 1);
+       }
+
        newdocp = xsltApplyStylesheet(sheetp, doc, (const char**)params);
 
+       if (clone == 1) {
+               xmlFreeDoc(doc);
+       }
+
        if (params) {
                efree(params);
        }
@@ -249,7 +272,7 @@
 /* }}} end xsl_xsltprocessor_transform_to_uri */
 
 
-/* {{{ proto xsl_string xsl_xsltprocessor_transform_to_xml(node doc);
+/* {{{ proto xsl_string xsl_xsltprocessor_transform_to_xml(node doc [,boolean clone]);
 */
 PHP_FUNCTION(xsl_xsltprocessor_transform_to_xml)
 {
@@ -257,7 +280,7 @@
        xmlDoc *doc = NULL;
        xmlDoc *newdocp;
        xsltStylesheetPtr sheetp;
-       int ret;
+       int ret, clone = 0;
        xmlChar *doc_txt_ptr;
        int doc_txt_len;
        char **params = NULL;
@@ -268,7 +291,7 @@
        intern = (xsl_object *)zend_object_store_get_object(id TSRMLS_CC);
        sheetp = (xsltStylesheetPtr) intern->ptr;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &docp) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o|l", &docp, &clone) == 
FAILURE) {
                RETURN_FALSE;
        }
        DOC_GET_OBJ(doc, docp, xmlDocPtr, docobj);
@@ -276,8 +299,17 @@
        if (intern->parameter) {
                params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC);
        }
+
+       if (clone == 1) {
+               doc = xmlCopyDoc(doc, 1);
+       }
+
        newdocp = xsltApplyStylesheet(sheetp, doc, (const char**)params);
-       
+
+       if (clone == 1) {
+               xmlFreeDoc(doc);
+       }
+
        if (params) {
                efree(params);
        }

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to