diff options
Diffstat (limited to 'ext/xsl/xsltprocessor.c')
-rw-r--r-- | ext/xsl/xsltprocessor.c | 57 |
1 files changed, 48 insertions, 9 deletions
diff --git a/ext/xsl/xsltprocessor.c b/ext/xsl/xsltprocessor.c index ce4538a56f..cfe4fa3dc3 100644 --- a/ext/xsl/xsltprocessor.c +++ b/ext/xsl/xsltprocessor.c @@ -124,7 +124,7 @@ Since: PHP_FUNCTION(xsl_xsltprocessor_import_stylesheet) { zval *id, *docp = NULL; - xmlDoc *doc; + xmlDoc *doc = NULL; xsltStylesheetPtr sheetp, oldsheetp; xmlDocPtr newdocp; xsl_object *intern; @@ -170,7 +170,7 @@ Since: PHP_FUNCTION(xsl_xsltprocessor_transform_to_doc) { zval *id, *rv = NULL, *docp = NULL; - xmlDoc *doc; + xmlDoc *doc = NULL; xmlDoc *newdocp; xsltStylesheetPtr sheetp; int ret; @@ -210,7 +210,41 @@ PHP_FUNCTION(xsl_xsltprocessor_transform_to_doc) */ PHP_FUNCTION(xsl_xsltprocessor_transform_to_uri) { - DOM_NOT_IMPLEMENTED(); + zval *id, *docp = NULL; + xmlDoc *doc = NULL; + xmlDoc *newdocp; + xsltStylesheetPtr sheetp; + int ret, uri_len; + char **params = NULL, *uri; + xsl_object *intern; + node_object *docobj; + + id = getThis(); + 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) { + RETURN_FALSE; + } + + DOC_GET_OBJ(doc, docp, xmlDocPtr, docobj); + + if (intern->parameter) { + params = php_xsl_xslt_make_params(intern->parameter, 0 TSRMLS_CC); + } + newdocp = xsltApplyStylesheet(sheetp, doc, (const char**)params); + + if (params) { + efree(params); + } + + ret = -1; + if (newdocp) { + ret = xsltSaveResultToFilename(uri, newdocp, sheetp, 0); + xmlFreeDoc(newdocp); + } + + RETVAL_LONG(ret); } /* }}} end xsl_xsltprocessor_transform_to_uri */ @@ -220,7 +254,7 @@ PHP_FUNCTION(xsl_xsltprocessor_transform_to_uri) PHP_FUNCTION(xsl_xsltprocessor_transform_to_xml) { zval *id, *docp = NULL; - xmlDoc *doc; + xmlDoc *doc = NULL; xmlDoc *newdocp; xsltStylesheetPtr sheetp; int ret; @@ -247,15 +281,20 @@ PHP_FUNCTION(xsl_xsltprocessor_transform_to_xml) if (params) { efree(params); } - ret = xsltSaveResultToString(&doc_txt_ptr, &doc_txt_len, newdocp, sheetp); + + ret = -1; + if (newdocp) { + ret = xsltSaveResultToString(&doc_txt_ptr, &doc_txt_len, newdocp, sheetp); + if (doc_txt_ptr) { + RETVAL_STRINGL(doc_txt_ptr, doc_txt_len, 1); + xmlFree(doc_txt_ptr); + } + xmlFreeDoc(newdocp); + } if (ret < 0) { RETURN_FALSE; } - - RETVAL_STRINGL(doc_txt_ptr, doc_txt_len, 1); - xmlFree(doc_txt_ptr); - xmlFreeDoc(newdocp); } /* }}} end xsl_xsltprocessor_transform_to_xml */ |