15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * imports.c: Implementation of the XSLT imports 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Reference: 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.w3.org/TR/1999/REC-xslt-19991116 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See Copyright for the status of this software. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * daniel@veillard.com 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IN_LIBXSLT 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "libxslt.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h> 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_SYS_TYPES_H 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/types.h> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_MATH_H 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <math.h> 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_FLOAT_H 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <float.h> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_IEEEFP_H 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ieeefp.h> 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_NAN_H 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <nan.h> 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef HAVE_CTYPE_H 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ctype.h> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlmemory.h> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/tree.h> 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/hash.h> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/xmlerror.h> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <libxml/uri.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xslt.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xsltInternals.h" 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xsltutils.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "preproc.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "imports.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "documents.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "security.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "pattern.h" 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/************************************************************************ 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Module interfaces * 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * * 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ************************************************************************/ 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltFixImportedCompSteps: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @master: the "master" stylesheet 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: the stylesheet being imported by the master 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * normalize the comp steps for the stylesheet being imported 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * by the master, together with any imports within that. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void xsltFixImportedCompSteps(xsltStylesheetPtr master, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr style) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr res; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashScan(style->templatesHash, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlHashScanner) xsltNormalizeCompSteps, master); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) master->extrasNr += style->extrasNr; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (res = style->imports; res != NULL; res = res->next) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFixImportedCompSteps(master, res); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltParseStylesheetImport: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: the XSLT stylesheet 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the import element 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse an XSLT stylesheet import element 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success -1 in case of failure. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltParseStylesheetImport(xsltStylesheetPtr style, xmlNodePtr cur) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = -1; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr import = NULL; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *base = NULL; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *uriRef = NULL; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URI = NULL; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr res; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltSecurityPrefsPtr sec; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == NULL) || (style == NULL)) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uriRef = xmlGetNsProp(cur, (const xmlChar *)"href", NULL); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uriRef == NULL) { 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:import : missing href attribute\n"); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = xmlNodeGetBase(style->doc, cur); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xmlBuildURI(uriRef, base); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == NULL) { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:import : invalid URI reference %s\n", uriRef); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = style; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (res != NULL) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res->doc == NULL) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(res->doc->URL, URI)) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:import : recursion detected on imported URL %s\n", URI); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = res->parent; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Security framework check 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sec = xsltGetDefaultSecurityPrefs(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sec != NULL) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int secres; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) secres = xsltCheckRead(sec, NULL, URI); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (secres == 0) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, NULL, NULL, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:import: read rights for %s denied\n", 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) import = xsltDocDefaultLoader(URI, style->dict, XSLT_PARSE_OPTIONS, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void *) style, XSLT_LOAD_STYLESHEET); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (import == NULL) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:import : unable to load %s\n", URI); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res = xsltParseStylesheetImportedDoc(import, style); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (res != NULL) { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) res->next = style->imports; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->imports = res; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->parent == NULL) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltFixImportedCompSteps(style, res); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFreeDoc(import); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uriRef != NULL) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(uriRef); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI != NULL) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URI); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltParseStylesheetInclude: 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @style: the XSLT stylesheet 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the include node 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * parse an XSLT stylesheet include element 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 0 in case of success -1 in case of failure 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltParseStylesheetInclude(xsltStylesheetPtr style, xmlNodePtr cur) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ret = -1; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlDocPtr oldDoc; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *base = NULL; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *uriRef = NULL; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlChar *URI = NULL; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr result; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDocumentPtr include; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltDocumentPtr docptr; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int oldNopreproc; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((cur == NULL) || (style == NULL)) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uriRef = xmlGetNsProp(cur, (const xmlChar *)"href", NULL); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uriRef == NULL) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:include : missing href attribute\n"); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base = xmlNodeGetBase(style->doc, cur); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URI = xmlBuildURI(uriRef, base); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI == NULL) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:include : invalid URI reference %s\n", uriRef); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in order to detect recursion, we check all previously included 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * stylesheets. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docptr = style->includes; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (docptr != NULL) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(docptr->doc->URL, URI)) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:include : recursion detected on included URL %s\n", URI); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) docptr = docptr->includes; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) include = xsltLoadStyleDocument(style, URI); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (include == NULL) { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "xsl:include : unable to load %s\n", URI); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XSLT_REFACTORED 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IS_XSLT_ELEM_FAST(cur) && (cur->psvi != NULL)) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((xsltStyleItemIncludePtr) cur->psvi)->include = include; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTransformError(NULL, style, cur, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Internal error: (xsltParseStylesheetInclude) " 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "The xsl:include element was not compiled.\n", URI); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->errors++; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldDoc = style->doc; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->doc = include->doc; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* chain to stylesheet for recursion checking */ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) include->includes = style->includes; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->includes = include; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) oldNopreproc = style->nopreproc; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->nopreproc = include->preproc; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * TODO: This will change some values of the 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * including stylesheet with every included module 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (e.g. excluded-result-prefixes) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We need to strictly seperate such stylesheet-owned values. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = xsltParseStylesheetProcess(style, include->doc); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->nopreproc = oldNopreproc; 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) include->preproc = 1; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->includes = include->includes; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style->doc = oldDoc; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == NULL) { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = -1; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) goto error; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret = 0; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)error: 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uriRef != NULL) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(uriRef); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base != NULL) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(base); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (URI != NULL) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlFree(URI); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (ret); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltNextImport: 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @cur: the current XSLT stylesheet 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find the next stylesheet in import precedence. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the next stylesheet or NULL if it was the last one 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltStylesheetPtr 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltNextImport(xsltStylesheetPtr cur) { 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->imports != NULL) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur->imports); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur->next) ; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) do { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->parent; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur == NULL) break; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cur->next != NULL) return(cur->next); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } while (cur != NULL); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltNeedElemSpaceHandling: 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks whether that stylesheet requires white-space stripping 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if space should be stripped, 0 if not 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltNeedElemSpaceHandling(xsltTransformContextPtr ctxt) { 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr style; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctxt == NULL) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = ctxt->style; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (style != NULL) { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->stripSpaces != NULL) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = xsltNextImport(style); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltFindElemSpaceHandling: 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @node: an XML node 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find strip-space or preserve-space informations for an element 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * respect the import precedence or the wildcards 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns 1 if space should be stripped, 0 if not, and 2 if everything 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * should be CDTATA wrapped. 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltFindElemSpaceHandling(xsltTransformContextPtr ctxt, xmlNodePtr node) { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr style; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *val; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (node == NULL)) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = ctxt->style; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (style != NULL) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->ns != NULL) { 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (const xmlChar *) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(style->stripSpaces, node->name, node->ns->href); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val == NULL) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (const xmlChar *) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(style->stripSpaces, BAD_CAST "*", 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node->ns->href); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) val = (const xmlChar *) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmlHashLookup2(style->stripSpaces, node->name, NULL); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (val != NULL) { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(val, (xmlChar *) "strip")) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(val, (xmlChar *) "preserve")) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->stripAll == 1) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(1); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (style->stripAll == -1) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = xsltNextImport(style); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(0); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * xsltFindTemplate: 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @ctxt: an XSLT transformation context 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @name: the template name 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @nameURI: the template name URI 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Finds the named template, apply import precedence rule. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * REVISIT TODO: We'll change the nameURI fields of 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * templates to be in the string dict, so if the 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * specified @nameURI is in the same dict, then use pointer 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * comparison. Check if this can be done in a sane way. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Maybe this function is not needed internally at 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * transformation-time if we hard-wire the called templates 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to the caller. 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Returns the xsltTemplatePtr or NULL if not found 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltTemplatePtr 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xsltFindTemplate(xsltTransformContextPtr ctxt, const xmlChar *name, 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const xmlChar *nameURI) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltTemplatePtr cur; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xsltStylesheetPtr style; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ctxt == NULL) || (name == NULL)) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = ctxt->style; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (style != NULL) { 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = style->templates; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (cur != NULL) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xmlStrEqual(name, cur->name)) { 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (((nameURI == NULL) && (cur->nameURI == NULL)) || 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((nameURI != NULL) && (cur->nameURI != NULL) && 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (xmlStrEqual(nameURI, cur->nameURI)))) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(cur); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cur = cur->next; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style = xsltNextImport(style); 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return(NULL); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 420