--- parser3/src/classes/xdoc.C 2002/03/27 15:30:34 1.87 +++ parser3/src/classes/xdoc.C 2002/04/10 09:53:14 1.91 @@ -4,7 +4,7 @@ Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) - $Id: xdoc.C,v 1.87 2002/03/27 15:30:34 paf Exp $ + $Id: xdoc.C,v 1.91 2002/04/10 09:53:14 paf Exp $ */ #include "classes.h" #ifdef XML @@ -25,6 +25,7 @@ extern "C" { #include "libxslt/xsltInternals.h" #include "libxslt/transform.h" #include "libxslt/xsltutils.h" +#include "libxslt/variables.h" // defines @@ -311,7 +312,7 @@ static void _importNode(Request& r, cons VXdoc& vdoc=*static_cast(r.self); GdomeNode *importedNode= - as_node(pool, method_name, params, 0, "importedNode must be node"); + as_node(method_name, params, 0, "importedNode must be node"); bool deep= params->as_bool(1, "deep must be bool", r); @@ -342,7 +343,7 @@ static void _create(Request& r, const St GdomeDocument *document; if(param.get_junction()) { // {} Temp_lang temp_lang(r, String::UL_XML); - const String& xml=r.process(param).as_string(); + const String& xml=r.process_to_string(param); const char *cstr=xml.cstr(String::UL_UNSPECIFIED); document=(GdomeDocument *) @@ -626,9 +627,9 @@ static void add_xslt_param(const Hash::K void *info) { Value *meaning=static_cast(ameaning); Pool& pool=meaning->pool(); - const char **transform_params=(const char **)info; - *transform_params++=pool.transcode(aattribute)->str; - *transform_params++=pool.transcode(meaning->as_string())->str; + const char ** & current_transform_param=*(const char ***)info; + *current_transform_param++=pool.transcode(aattribute)->str; + *current_transform_param++=pool.transcode(meaning->as_string())->str; } static void _transform(Request& r, const String& method_name, MethodParams *params) { //_asm int 3; @@ -641,9 +642,9 @@ static void _transform(Request& r, const Value& vparams=params->as_no_junction(1, "transform parameters must be hash"); if(vparams.is_defined()) if(Hash *params=vparams.get_hash(&method_name)) { - transform_params= - (const char **)pool.malloc(sizeof(const char *)*params->size()*2+1); - params->for_each(add_xslt_param, transform_params); + const char **current_transform_param=transform_params= + (const char **)pool.malloc(sizeof(const char *)*(params->size()*2+1)); + params->for_each(add_xslt_param, ¤t_transform_param); transform_params[params->size()*2]=0; } else throw Exception("parser.runtime", @@ -655,15 +656,20 @@ static void _transform(Request& r, const const String& stylesheet_filespec=r.absolute(params->as_string(0, "file name must be string")); Stylesheet_connection_ptr connection=stylesheet_manager->get_connection(stylesheet_filespec); - // transform + // prepare to transform xsltStylesheet *stylesheet=connection->stylesheet(false/*nocache*/); xmlDoc *document=gdome_xml_doc_get_xmlDoc(vdoc.get_document(&method_name)); xsltTransformContext_auto_ptr transformContext( xsltNewTransformContext(stylesheet, document)); + // make params literal + if (transformContext->globalVars == NULL) // strangly not initialized by xsltNewTransformContext + transformContext->globalVars = xmlHashCreate(20); + xsltQuoteUserParams(transformContext.get(), transform_params); + // do transform xmlDoc *transformed=xsltApplyStylesheetUser( stylesheet, document, - transform_params, + 0/*already quoted-inserted transform_params*/, 0/*const char *output*/, 0/*FILE *profile*/, transformContext.get());