17d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/* 27d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * documents.c: Implementation of the documents handling 37d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 47d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * See Copyright for the status of this software. 57d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 67d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * daniel@veillard.com 77d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 87d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 97d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#define IN_LIBXSLT 107d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "libxslt.h" 117d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 127d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include <string.h> 137d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 147d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include <libxml/xmlmemory.h> 157d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include <libxml/tree.h> 167d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include <libxml/hash.h> 177d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include <libxml/parser.h> 187d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include <libxml/parserInternals.h> 197d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "xslt.h" 207d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "xsltInternals.h" 217d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "xsltutils.h" 227d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "documents.h" 237d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "transform.h" 247d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "imports.h" 257d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "keys.h" 267d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include "security.h" 277d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 287d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#ifdef LIBXML_XINCLUDE_ENABLED 297d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#include <libxml/xinclude.h> 307d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#endif 317d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 327d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#define WITH_XSLT_DEBUG_DOCUMENTS 337d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 347d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#ifdef WITH_XSLT_DEBUG 357d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#define WITH_XSLT_DEBUG_DOCUMENTS 367d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#endif 377d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 387d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/************************************************************************ 397d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * * 407d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Hooks for the document loader * 417d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * * 427d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ************************************************************************/ 437d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 447d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 457d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltDocDefaultLoaderFunc: 467d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @URI: the URI of the document to load 477d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @dict: the dictionary to use when parsing that document 487d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @options: parsing options, a set of xmlParserOption 497d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @ctxt: the context, either a stylesheet or a transformation context 507d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @type: the xsltLoadType indicating the kind of loading required 517d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 527d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Default function to load document not provided by the compilation or 537d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * transformation API themselve, for example when an xsl:import, 547d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsl:include is found at compilation time or when a document() 557d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * call is made at runtime. 567d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 577d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Returns the pointer to the document (which will be modified and 587d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * freed by the engine later), or NULL in case of error. 597d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 607d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangstatic xmlDocPtr 617d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltDocDefaultLoaderFunc(const xmlChar * URI, xmlDictPtr dict, int options, 627d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang void *ctxt ATTRIBUTE_UNUSED, 637d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltLoadType type ATTRIBUTE_UNUSED) 647d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang{ 657d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlParserCtxtPtr pctxt; 667d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlParserInputPtr inputStream; 677d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlDocPtr doc; 687d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 697d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang pctxt = xmlNewParserCtxt(); 707d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (pctxt == NULL) 717d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 727d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if ((dict != NULL) && (pctxt->dict != NULL)) { 737d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlDictFree(pctxt->dict); 747d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang pctxt->dict = NULL; 757d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 767d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (dict != NULL) { 777d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang pctxt->dict = dict; 787d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlDictReference(pctxt->dict); 797d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#ifdef WITH_XSLT_DEBUG 807d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltGenericDebug(xsltGenericDebugContext, 817d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang "Reusing dictionary for document\n"); 827d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#endif 837d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 847d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlCtxtUseOptions(pctxt, options); 857d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang inputStream = xmlLoadExternalEntity((const char *) URI, NULL, pctxt); 867d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (inputStream == NULL) { 877d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFreeParserCtxt(pctxt); 887d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 897d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 907d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang inputPush(pctxt, inputStream); 917d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (pctxt->directory == NULL) 927d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang pctxt->directory = xmlParserGetDirectory((const char *) URI); 937d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 947d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlParseDocument(pctxt); 957d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 967d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (pctxt->wellFormed) { 977d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang doc = pctxt->myDoc; 987d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 997d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang else { 1007d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang doc = NULL; 1017d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFreeDoc(pctxt->myDoc); 1027d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang pctxt->myDoc = NULL; 1037d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 1047d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFreeParserCtxt(pctxt); 1057d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1067d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(doc); 1077d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 1087d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1097d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1107d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltDocLoaderFunc xsltDocDefaultLoader = xsltDocDefaultLoaderFunc; 1117d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1127d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 1137d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltSetLoaderFunc: 1147d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @f: the new function to handle document loading. 1157d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 1167d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Set the new function to load document, if NULL it resets it to the 1177d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * default function. 1187d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 1197d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1207d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangvoid 1217d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltSetLoaderFunc(xsltDocLoaderFunc f) { 1227d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (f == NULL) 1237d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocDefaultLoader = xsltDocDefaultLoaderFunc; 1247d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang else 1257d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocDefaultLoader = f; 1267d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 1277d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1287d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/************************************************************************ 1297d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * * 1307d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Module interfaces * 1317d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * * 1327d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ************************************************************************/ 1337d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1347d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 1357d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltNewDocument: 1367d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @ctxt: an XSLT transformation context (or NULL) 1377d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @doc: a parsed XML document 1387d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 1397d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Register a new document, apply key computations 1407d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 1417d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Returns a handler to the document 1427d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 1437d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltDocumentPtr 1447d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltNewDocument(xsltTransformContextPtr ctxt, xmlDocPtr doc) { 1457d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocumentPtr cur; 1467d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1477d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur = (xsltDocumentPtr) xmlMalloc(sizeof(xsltDocument)); 1487d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (cur == NULL) { 1497d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltTransformError(ctxt, NULL, (xmlNodePtr) doc, 1507d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang "xsltNewDocument : malloc failed\n"); 1517d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 1527d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 1537d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang memset(cur, 0, sizeof(xsltDocument)); 1547d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur->doc = doc; 1557d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (ctxt != NULL) { 1567d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (! XSLT_IS_RES_TREE_FRAG(doc)) { 1577d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur->next = ctxt->docList; 1587d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ctxt->docList = cur; 1597d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 1607d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang /* 1617d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * A key with a specific name for a specific document 1627d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * will only be computed if there's a call to the key() 1637d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * function using that specific name for that specific 1647d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * document. I.e. computation of keys will be done in 1657d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltGetKey() (keys.c) on an on-demand basis. 1667d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 1677d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltInitCtxtKeys(ctxt, cur); not called here anymore 1687d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 1697d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 1707d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(cur); 1717d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 1727d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1737d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 1747d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltNewStyleDocument: 1757d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @style: an XSLT style sheet 1767d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @doc: a parsed XML document 1777d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 1787d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Register a new document, apply key computations 1797d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 1807d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Returns a handler to the document 1817d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 1827d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltDocumentPtr 1837d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltNewStyleDocument(xsltStylesheetPtr style, xmlDocPtr doc) { 1847d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocumentPtr cur; 1857d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 1867d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur = (xsltDocumentPtr) xmlMalloc(sizeof(xsltDocument)); 1877d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (cur == NULL) { 1887d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltTransformError(NULL, style, (xmlNodePtr) doc, 1897d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang "xsltNewStyleDocument : malloc failed\n"); 1907d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 1917d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 1927d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang memset(cur, 0, sizeof(xsltDocument)); 1937d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur->doc = doc; 1947d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (style != NULL) { 1957d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur->next = style->docList; 1967d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang style->docList = cur; 1977d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 1987d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(cur); 1997d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 2007d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2017d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 2027d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltFreeStyleDocuments: 2037d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @style: an XSLT stylesheet (representing a stylesheet-level) 2047d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 2057d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Frees the node-trees (and xsltDocument structures) of all 2067d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * stylesheet-modules of the stylesheet-level represented by 2077d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * the given @style. 2087d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 2097d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangvoid 2107d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltFreeStyleDocuments(xsltStylesheetPtr style) { 2117d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocumentPtr doc, cur; 2127d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#ifdef XSLT_REFACTORED_XSLT_NSCOMP 2137d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltNsMapPtr nsMap; 2147d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#endif 2157d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2167d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (style == NULL) 2177d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return; 2187d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2197d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#ifdef XSLT_REFACTORED_XSLT_NSCOMP 2207d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (XSLT_HAS_INTERNAL_NSMAP(style)) 2217d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang nsMap = XSLT_GET_INTERNAL_NSMAP(style); 2227d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang else 2237d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang nsMap = NULL; 2247d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#endif 2257d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2267d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur = style->docList; 2277d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang while (cur != NULL) { 2287d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang doc = cur; 2297d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur = cur->next; 2307d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#ifdef XSLT_REFACTORED_XSLT_NSCOMP 2317d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang /* 2327d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Restore all changed namespace URIs of ns-decls. 2337d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 2347d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (nsMap) 2357d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltRestoreDocumentNamespaces(nsMap, doc->doc); 2367d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#endif 2377d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltFreeDocumentKeys(doc); 2387d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (!doc->main) 2397d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFreeDoc(doc->doc); 2407d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFree(doc); 2417d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 2427d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 2437d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2447d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 2457d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltFreeDocuments: 2467d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @ctxt: an XSLT transformation context 2477d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 2487d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Free up all the space used by the loaded documents 2497d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 2507d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wangvoid 2517d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltFreeDocuments(xsltTransformContextPtr ctxt) { 2527d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocumentPtr doc, cur; 2537d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2547d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur = ctxt->docList; 2557d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang while (cur != NULL) { 2567d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang doc = cur; 2577d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur = cur->next; 2587d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltFreeDocumentKeys(doc); 2597d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (!doc->main) 2607d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFreeDoc(doc->doc); 2617d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFree(doc); 2627d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 2637d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur = ctxt->styleList; 2647d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang while (cur != NULL) { 2657d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang doc = cur; 2667d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang cur = cur->next; 2677d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltFreeDocumentKeys(doc); 2687d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (!doc->main) 2697d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFreeDoc(doc->doc); 2707d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlFree(doc); 2717d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 2727d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 2737d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2747d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 2757d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltLoadDocument: 2767d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @ctxt: an XSLT transformation context 2777d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @URI: the computed URI of the document 2787d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 2797d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Try to load a document (not a stylesheet) 2807d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * within the XSLT transformation context 2817d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 2827d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Returns the new xsltDocumentPtr or NULL in case of error 2837d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 2847d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltDocumentPtr 2857d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltLoadDocument(xsltTransformContextPtr ctxt, const xmlChar *URI) { 2867d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocumentPtr ret; 2877d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlDocPtr doc; 2887d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2897d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if ((ctxt == NULL) || (URI == NULL)) 2907d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 2917d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2927d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang /* 2937d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Security framework check 2947d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 2957d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (ctxt->sec != NULL) { 2967d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang int res; 2977d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 2987d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang res = xsltCheckRead(ctxt->sec, ctxt, URI); 2997d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (res == 0) { 3007d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltTransformError(ctxt, NULL, NULL, 3017d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang "xsltLoadDocument: read rights for %s denied\n", 3027d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang URI); 3037d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 3047d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 3057d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 3067d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3077d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang /* 3087d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Walk the context list to find the document if preparsed 3097d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 3107d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ret = ctxt->docList; 3117d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang while (ret != NULL) { 3127d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if ((ret->doc != NULL) && (ret->doc->URL != NULL) && 3137d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang (xmlStrEqual(ret->doc->URL, URI))) 3147d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(ret); 3157d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ret = ret->next; 3167d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 3177d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3187d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang doc = xsltDocDefaultLoader(URI, ctxt->dict, ctxt->parserOptions, 3197d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang (void *) ctxt, XSLT_LOAD_DOCUMENT); 3207d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3217d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (doc == NULL) 3227d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 3237d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3247d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (ctxt->xinclude != 0) { 3257d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#ifdef LIBXML_XINCLUDE_ENABLED 3267d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#if LIBXML_VERSION >= 20603 3277d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlXIncludeProcessFlags(doc, ctxt->parserOptions); 3287d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#else 3297d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlXIncludeProcess(doc); 3307d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#endif 3317d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#else 3327d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltTransformError(ctxt, NULL, NULL, 3337d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang "xsltLoadDocument(%s) : XInclude processing not compiled in\n", 3347d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang URI); 3357d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang#endif 3367d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 3377d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang /* 3387d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Apply white-space stripping if asked for 3397d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 3407d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (xsltNeedElemSpaceHandling(ctxt)) 3417d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltApplyStripSpaces(ctxt, xmlDocGetRootElement(doc)); 3427d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (ctxt->debugStatus == XSLT_DEBUG_NONE) 3437d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlXPathOrderDocElems(doc); 3447d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3457d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ret = xsltNewDocument(ctxt, doc); 3467d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(ret); 3477d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 3487d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3497d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 3507d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltLoadStyleDocument: 3517d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @style: an XSLT style sheet 3527d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @URI: the computed URI of the document 3537d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 3547d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Try to load a stylesheet document within the XSLT transformation context 3557d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 3567d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Returns the new xsltDocumentPtr or NULL in case of error 3577d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 3587d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltDocumentPtr 3597d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltLoadStyleDocument(xsltStylesheetPtr style, const xmlChar *URI) { 3607d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocumentPtr ret; 3617d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xmlDocPtr doc; 3627d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltSecurityPrefsPtr sec; 3637d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3647d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if ((style == NULL) || (URI == NULL)) 3657d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 3667d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3677d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang /* 3687d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Security framework check 3697d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 3707d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang sec = xsltGetDefaultSecurityPrefs(); 3717d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (sec != NULL) { 3727d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang int res; 3737d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3747d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang res = xsltCheckRead(sec, NULL, URI); 3757d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (res == 0) { 3767d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltTransformError(NULL, NULL, NULL, 3777d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang "xsltLoadStyleDocument: read rights for %s denied\n", 3787d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang URI); 3797d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 3807d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 3817d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 3827d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3837d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang /* 3847d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Walk the context list to find the document if preparsed 3857d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 3867d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ret = style->docList; 3877d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang while (ret != NULL) { 3887d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if ((ret->doc != NULL) && (ret->doc->URL != NULL) && 3897d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang (xmlStrEqual(ret->doc->URL, URI))) 3907d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(ret); 3917d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ret = ret->next; 3927d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 3937d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3947d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang doc = xsltDocDefaultLoader(URI, style->dict, XSLT_PARSE_OPTIONS, 3957d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang (void *) style, XSLT_LOAD_STYLESHEET); 3967d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (doc == NULL) 3977d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 3987d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 3997d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ret = xsltNewStyleDocument(style, doc); 4007d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(ret); 4017d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 4027d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 4037d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang/** 4047d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * xsltFindDocument: 4057d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @ctxt: an XSLT transformation context 4067d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * @doc: a parsed XML document 4077d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 4087d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Try to find a document within the XSLT transformation context. 4097d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * This will not find document infos for temporary 4107d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Result Tree Fragments. 4117d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * 4127d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Returns the desired xsltDocumentPtr or NULL in case of error 4137d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 4147d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltDocumentPtr 4157d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) WangxsltFindDocument (xsltTransformContextPtr ctxt, xmlDocPtr doc) { 4167d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang xsltDocumentPtr ret; 4177d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 4187d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if ((ctxt == NULL) || (doc == NULL)) 4197d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 4207d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 4217d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang /* 4227d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang * Walk the context list to find the document 4237d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang */ 4247d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ret = ctxt->docList; 4257d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang while (ret != NULL) { 4267d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (ret->doc == doc) 4277d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(ret); 4287d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang ret = ret->next; 4297d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang } 4307d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang if (doc == ctxt->style->doc) 4317d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(ctxt->document); 4327d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang return(NULL); 4337d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang} 4347d1dabff1598661db0018d89d16cca02f7c31ae2Shimeng (Simon) Wang 435