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