void XSLStyleSheet::loadChildSheets() { if (!document()) return; xmlNodePtr stylesheetRoot = document()->children; // Top level children may include other things such as DTD nodes, we ignore // those. while (stylesheetRoot && stylesheetRoot->type != XML_ELEMENT_NODE) stylesheetRoot = stylesheetRoot->next; if (m_embedded) { // We have to locate (by ID) the appropriate embedded stylesheet // element, so that we can walk the import/include list. xmlAttrPtr idNode = xmlGetID(document(), (const xmlChar*)(finalURL().string().utf8().data())); if (!idNode) return; stylesheetRoot = idNode->parent; } else { // FIXME: Need to handle an external URI with a # in it. This is a // pretty minor edge case, so we'll deal with it later. } if (stylesheetRoot) { // Walk the children of the root element and look for import/include // elements. Imports must occur first. xmlNodePtr curr = stylesheetRoot->children; while (curr) { if (curr->type != XML_ELEMENT_NODE) { curr = curr->next; continue; } if (IS_XSLT_ELEM(curr) && IS_XSLT_NAME(curr, "import")) { xmlChar* uriRef = xsltGetNsProp(curr, (const xmlChar*)"href", XSLT_NAMESPACE); loadChildSheet(String::fromUTF8((const char*)uriRef)); xmlFree(uriRef); } else { break; } curr = curr->next; } // Now handle includes. while (curr) { if (curr->type == XML_ELEMENT_NODE && IS_XSLT_ELEM(curr) && IS_XSLT_NAME(curr, "include")) { xmlChar* uriRef = xsltGetNsProp(curr, (const xmlChar*)"href", XSLT_NAMESPACE); loadChildSheet(String::fromUTF8((const char*)uriRef)); xmlFree(uriRef); } curr = curr->next; } } }
/** * xsltEvalStaticAttrValueTemplate: * @style: the XSLT stylesheet * @inst: the instruction (or LRE) in the stylesheet holding the * attribute with an AVT * @name: the attribute Name * @ns: the attribute namespace URI * @found: indicator whether the attribute is present * * Check if an attribute value template has a static value, i.e. the * attribute value does not contain expressions contained in curly braces ({}) * * Returns the static string value or NULL, must be deallocated by the * caller. */ const xmlChar * xsltEvalStaticAttrValueTemplate(xsltStylesheetPtr style, xmlNodePtr inst, const xmlChar *name, const xmlChar *ns, int *found) { const xmlChar *ret; xmlChar *expr; if ((style == NULL) || (inst == NULL) || (name == NULL)) return(NULL); expr = xsltGetNsProp(inst, name, ns); if (expr == NULL) { *found = 0; return(NULL); } *found = 1; ret = xmlStrchr(expr, '{'); if (ret != NULL) { xmlFree(expr); return(NULL); } ret = xmlDictLookup(style->dict, expr, -1); xmlFree(expr); return(ret); }
/** * xsltEvalAttrValueTemplate: * @ctxt: the XSLT transformation context * @inst: the instruction (or LRE) in the stylesheet holding the * attribute with an AVT * @name: the attribute QName * @ns: the attribute namespace URI * * Evaluate a attribute value template, i.e. the attribute value can * contain expressions contained in curly braces ({}) and those are * substituted by they computed value. * * Returns the computed string value or NULL, must be deallocated by the * caller. */ xmlChar * xsltEvalAttrValueTemplate(xsltTransformContextPtr ctxt, xmlNodePtr inst, const xmlChar *name, const xmlChar *ns) { xmlChar *ret; xmlChar *expr; if ((ctxt == NULL) || (inst == NULL) || (name == NULL)) return(NULL); expr = xsltGetNsProp(inst, name, ns); if (expr == NULL) return(NULL); /* * TODO: though now {} is detected ahead, it would still be good to * optimize both functions to keep the splitted value if the * attribute content and the XPath precompiled expressions around */ ret = xsltAttrTemplateValueProcessNode(ctxt, expr, inst); #ifdef WITH_XSLT_DEBUG_TEMPLATES XSLT_TRACE(ctxt,XSLT_TRACE_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, "xsltEvalAttrValueTemplate: %s returns %s\n", expr, ret)); #endif if (expr != NULL) xmlFree(expr); return(ret); }
xmlChar * xsltEvalAttrValueTemplate(xsltTransformContextPtr ctxt, xmlNodePtr inst, const xmlChar *name, const xmlChar *ns) { xmlChar *ret; xmlChar *expr; if ((ctxt == NULL) || (inst == NULL) || (name == NULL)) return(NULL); expr = xsltGetNsProp(inst, name, ns); if (expr == NULL) return(NULL); ret = xsltAttrTemplateValueProcessNode(ctxt, expr, inst); #ifdef WITH_XSLT_DEBUG_TEMPLATES XSLT_TRACE(ctxt,XSLT_TRACE_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, "xsltEvalAttrValueTemplate: %s returns %s\n", expr, ret)); #endif if (expr != NULL) xmlFree(expr); return(ret); }
/** * xsltNamespaceAlias: * @style: the XSLT stylesheet * @node: the xsl:namespace-alias node * * Read the stylesheet-prefix and result-prefix attributes, register * them as well as the corresponding namespace. */ void xsltNamespaceAlias(xsltStylesheetPtr style, xmlNodePtr node) { xmlChar *sprefix; xmlNsPtr sNs; xmlChar *rprefix; xmlNsPtr rNs; sprefix = xsltGetNsProp(node, (const xmlChar *)"stylesheet-prefix", XSLT_NAMESPACE); if (sprefix == NULL) { xsltPrintErrorContext(NULL, style, node); xsltGenericError(xsltGenericErrorContext, "namespace-alias: stylesheet-prefix attribute missing\n"); return; } rprefix = xsltGetNsProp(node, (const xmlChar *)"result-prefix", XSLT_NAMESPACE); if (rprefix == NULL) { xsltPrintErrorContext(NULL, style, node); xsltGenericError(xsltGenericErrorContext, "namespace-alias: result-prefix attribute missing\n"); goto error; } if (xmlStrEqual(sprefix, (const xmlChar *)"#default")) { sNs = xmlSearchNs(node->doc, node, NULL); } else { sNs = xmlSearchNs(node->doc, node, sprefix); } if ((sNs == NULL) || (sNs->href == NULL)) { xsltPrintErrorContext(NULL, style, node); xsltGenericError(xsltGenericErrorContext, "namespace-alias: prefix %s not bound to any namespace\n", sprefix); goto error; } if (xmlStrEqual(rprefix, (const xmlChar *)"#default")) { rNs = xmlSearchNs(node->doc, node, NULL); } else { rNs = xmlSearchNs(node->doc, node, rprefix); } if ((rNs == NULL) || (rNs->href == NULL)) { xsltPrintErrorContext(NULL, style, node); xsltGenericError(xsltGenericErrorContext, "namespace-alias: prefix %s not bound to any namespace\n", rprefix); goto error; } if (style->nsAliases == NULL) style->nsAliases = xmlHashCreate(10); if (style->nsAliases == NULL) { xsltPrintErrorContext(NULL, style, node); xsltGenericError(xsltGenericErrorContext, "namespace-alias: cannot create hash table\n"); goto error; } xmlHashAddEntry((xmlHashTablePtr) style->nsAliases, sNs->href, (void *) rNs->href); error: if (sprefix != NULL) xmlFree(sprefix); if (rprefix != NULL) xmlFree(rprefix); }