Index: third_party/libxslt/libxslt/preproc.c |
diff --git a/third_party/libxslt/libxslt/preproc.c b/third_party/libxslt/libxslt/preproc.c |
deleted file mode 100644 |
index 9a7de532bd69f50ce2f517aacf08f1e895c9a436..0000000000000000000000000000000000000000 |
--- a/third_party/libxslt/libxslt/preproc.c |
+++ /dev/null |
@@ -1,2376 +0,0 @@ |
-/* |
- * preproc.c: Preprocessing of style operations |
- * |
- * References: |
- * http://www.w3.org/TR/1999/REC-xslt-19991116 |
- * |
- * Michael Kay "XSLT Programmer's Reference" pp 637-643 |
- * Writing Multiple Output Files |
- * |
- * XSLT-1.1 Working Draft |
- * http://www.w3.org/TR/xslt11#multiple-output |
- * |
- * See Copyright for the status of this software. |
- * |
- * daniel@veillard.com |
- */ |
- |
-#define IN_LIBXSLT |
-#include "libxslt.h" |
- |
-#include <string.h> |
- |
-#include <libxml/xmlmemory.h> |
-#include <libxml/parser.h> |
-#include <libxml/tree.h> |
-#include <libxml/valid.h> |
-#include <libxml/hash.h> |
-#include <libxml/uri.h> |
-#include <libxml/encoding.h> |
-#include <libxml/xmlerror.h> |
-#include "xslt.h" |
-#include "xsltutils.h" |
-#include "xsltInternals.h" |
-#include "transform.h" |
-#include "templates.h" |
-#include "variables.h" |
-#include "numbersInternals.h" |
-#include "preproc.h" |
-#include "extra.h" |
-#include "imports.h" |
-#include "extensions.h" |
-#include "pattern.h" |
- |
-#ifdef WITH_XSLT_DEBUG |
-#define WITH_XSLT_DEBUG_PREPROC |
-#endif |
- |
-const xmlChar *xsltExtMarker = (const xmlChar *) "Extension Element"; |
- |
-/************************************************************************ |
- * * |
- * Grammar checks * |
- * * |
- ************************************************************************/ |
- |
-#ifdef XSLT_REFACTORED |
- /* |
- * Grammar checks are now performed in xslt.c. |
- */ |
-#else |
-/** |
- * xsltCheckTopLevelElement: |
- * @style: the XSLT stylesheet |
- * @inst: the XSLT instruction |
- * @err: raise an error or not |
- * |
- * Check that the instruction is instanciated as a top level element. |
- * |
- * Returns -1 in case of error, 0 if failed and 1 in case of success |
- */ |
-static int |
-xsltCheckTopLevelElement(xsltStylesheetPtr style, xmlNodePtr inst, int err) { |
- xmlNodePtr parent; |
- if ((style == NULL) || (inst == NULL) || (inst->ns == NULL)) |
- return(-1); |
- |
- parent = inst->parent; |
- if (parent == NULL) { |
- if (err) { |
- xsltTransformError(NULL, style, inst, |
- "internal problem: element has no parent\n"); |
- style->errors++; |
- } |
- return(0); |
- } |
- if ((parent->ns == NULL) || (parent->type != XML_ELEMENT_NODE) || |
- ((parent->ns != inst->ns) && |
- (!xmlStrEqual(parent->ns->href, inst->ns->href))) || |
- ((!xmlStrEqual(parent->name, BAD_CAST "stylesheet")) && |
- (!xmlStrEqual(parent->name, BAD_CAST "transform")))) { |
- if (err) { |
- xsltTransformError(NULL, style, inst, |
- "element %s only allowed as child of stylesheet\n", |
- inst->name); |
- style->errors++; |
- } |
- return(0); |
- } |
- return(1); |
-} |
- |
-/** |
- * xsltCheckInstructionElement: |
- * @style: the XSLT stylesheet |
- * @inst: the XSLT instruction |
- * |
- * Check that the instruction is instanciated as an instruction element. |
- */ |
-static void |
-xsltCheckInstructionElement(xsltStylesheetPtr style, xmlNodePtr inst) { |
- xmlNodePtr parent; |
- int has_ext; |
- |
- if ((style == NULL) || (inst == NULL) || (inst->ns == NULL) || |
- (style->literal_result)) |
- return; |
- |
- has_ext = (style->extInfos != NULL); |
- |
- parent = inst->parent; |
- if (parent == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "internal problem: element has no parent\n"); |
- style->errors++; |
- return; |
- } |
- while ((parent != NULL) && (parent->type != XML_DOCUMENT_NODE)) { |
- if (((parent->ns == inst->ns) || |
- ((parent->ns != NULL) && |
- (xmlStrEqual(parent->ns->href, inst->ns->href)))) && |
- ((xmlStrEqual(parent->name, BAD_CAST "template")) || |
- (xmlStrEqual(parent->name, BAD_CAST "param")) || |
- (xmlStrEqual(parent->name, BAD_CAST "attribute")) || |
- (xmlStrEqual(parent->name, BAD_CAST "variable")))) { |
- return; |
- } |
- |
- /* |
- * if we are within an extension element all bets are off |
- * about the semantic there e.g. xsl:param within func:function |
- */ |
- if ((has_ext) && (parent->ns != NULL) && |
- (xmlHashLookup(style->extInfos, parent->ns->href) != NULL)) |
- return; |
- |
- parent = parent->parent; |
- } |
- xsltTransformError(NULL, style, inst, |
- "element %s only allowed within a template, variable or param\n", |
- inst->name); |
- style->errors++; |
-} |
- |
-/** |
- * xsltCheckParentElement: |
- * @style: the XSLT stylesheet |
- * @inst: the XSLT instruction |
- * @allow1: allowed parent1 |
- * @allow2: allowed parent2 |
- * |
- * Check that the instruction is instanciated as the childre of one of the |
- * possible parents. |
- */ |
-static void |
-xsltCheckParentElement(xsltStylesheetPtr style, xmlNodePtr inst, |
- const xmlChar *allow1, const xmlChar *allow2) { |
- xmlNodePtr parent; |
- |
- if ((style == NULL) || (inst == NULL) || (inst->ns == NULL) || |
- (style->literal_result)) |
- return; |
- |
- parent = inst->parent; |
- if (parent == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "internal problem: element has no parent\n"); |
- style->errors++; |
- return; |
- } |
- if (((parent->ns == inst->ns) || |
- ((parent->ns != NULL) && |
- (xmlStrEqual(parent->ns->href, inst->ns->href)))) && |
- ((xmlStrEqual(parent->name, allow1)) || |
- (xmlStrEqual(parent->name, allow2)))) { |
- return; |
- } |
- |
- if (style->extInfos != NULL) { |
- while ((parent != NULL) && (parent->type != XML_DOCUMENT_NODE)) { |
- /* |
- * if we are within an extension element all bets are off |
- * about the semantic there e.g. xsl:param within func:function |
- */ |
- if ((parent->ns != NULL) && |
- (xmlHashLookup(style->extInfos, parent->ns->href) != NULL)) |
- return; |
- |
- parent = parent->parent; |
- } |
- } |
- xsltTransformError(NULL, style, inst, |
- "element %s is not allowed within that context\n", |
- inst->name); |
- style->errors++; |
-} |
-#endif |
- |
-/************************************************************************ |
- * * |
- * handling of precomputed data * |
- * * |
- ************************************************************************/ |
- |
-/** |
- * xsltNewStylePreComp: |
- * @style: the XSLT stylesheet |
- * @type: the construct type |
- * |
- * Create a new XSLT Style precomputed block |
- * |
- * Returns the newly allocated specialized structure |
- * or NULL in case of error |
- */ |
-static xsltStylePreCompPtr |
-xsltNewStylePreComp(xsltStylesheetPtr style, xsltStyleType type) { |
- xsltStylePreCompPtr cur; |
-#ifdef XSLT_REFACTORED |
- size_t size; |
-#endif |
- |
- if (style == NULL) |
- return(NULL); |
- |
-#ifdef XSLT_REFACTORED |
- /* |
- * URGENT TODO: Use specialized factory functions in order |
- * to avoid this ugliness. |
- */ |
- switch (type) { |
- case XSLT_FUNC_COPY: |
- size = sizeof(xsltStyleItemCopy); break; |
- case XSLT_FUNC_SORT: |
- size = sizeof(xsltStyleItemSort); break; |
- case XSLT_FUNC_TEXT: |
- size = sizeof(xsltStyleItemText); break; |
- case XSLT_FUNC_ELEMENT: |
- size = sizeof(xsltStyleItemElement); break; |
- case XSLT_FUNC_ATTRIBUTE: |
- size = sizeof(xsltStyleItemAttribute); break; |
- case XSLT_FUNC_COMMENT: |
- size = sizeof(xsltStyleItemComment); break; |
- case XSLT_FUNC_PI: |
- size = sizeof(xsltStyleItemPI); break; |
- case XSLT_FUNC_COPYOF: |
- size = sizeof(xsltStyleItemCopyOf); break; |
- case XSLT_FUNC_VALUEOF: |
- size = sizeof(xsltStyleItemValueOf); break;; |
- case XSLT_FUNC_NUMBER: |
- size = sizeof(xsltStyleItemNumber); break; |
- case XSLT_FUNC_APPLYIMPORTS: |
- size = sizeof(xsltStyleItemApplyImports); break; |
- case XSLT_FUNC_CALLTEMPLATE: |
- size = sizeof(xsltStyleItemCallTemplate); break; |
- case XSLT_FUNC_APPLYTEMPLATES: |
- size = sizeof(xsltStyleItemApplyTemplates); break; |
- case XSLT_FUNC_CHOOSE: |
- size = sizeof(xsltStyleItemChoose); break; |
- case XSLT_FUNC_IF: |
- size = sizeof(xsltStyleItemIf); break; |
- case XSLT_FUNC_FOREACH: |
- size = sizeof(xsltStyleItemForEach); break; |
- case XSLT_FUNC_DOCUMENT: |
- size = sizeof(xsltStyleItemDocument); break; |
- case XSLT_FUNC_WITHPARAM: |
- size = sizeof(xsltStyleItemWithParam); break; |
- case XSLT_FUNC_PARAM: |
- size = sizeof(xsltStyleItemParam); break; |
- case XSLT_FUNC_VARIABLE: |
- size = sizeof(xsltStyleItemVariable); break; |
- case XSLT_FUNC_WHEN: |
- size = sizeof(xsltStyleItemWhen); break; |
- case XSLT_FUNC_OTHERWISE: |
- size = sizeof(xsltStyleItemOtherwise); break; |
- default: |
- xsltTransformError(NULL, style, NULL, |
- "xsltNewStylePreComp : invalid type %d\n", type); |
- style->errors++; |
- return(NULL); |
- } |
- /* |
- * Create the structure. |
- */ |
- cur = (xsltStylePreCompPtr) xmlMalloc(size); |
- if (cur == NULL) { |
- xsltTransformError(NULL, style, NULL, |
- "xsltNewStylePreComp : malloc failed\n"); |
- style->errors++; |
- return(NULL); |
- } |
- memset(cur, 0, size); |
- |
-#else /* XSLT_REFACTORED */ |
- /* |
- * Old behaviour. |
- */ |
- cur = (xsltStylePreCompPtr) xmlMalloc(sizeof(xsltStylePreComp)); |
- if (cur == NULL) { |
- xsltTransformError(NULL, style, NULL, |
- "xsltNewStylePreComp : malloc failed\n"); |
- style->errors++; |
- return(NULL); |
- } |
- memset(cur, 0, sizeof(xsltStylePreComp)); |
-#endif /* XSLT_REFACTORED */ |
- |
- /* |
- * URGENT TODO: Better to move this to spezialized factory functions. |
- */ |
- cur->type = type; |
- switch (cur->type) { |
- case XSLT_FUNC_COPY: |
- cur->func = (xsltTransformFunction) xsltCopy;break; |
- case XSLT_FUNC_SORT: |
- cur->func = (xsltTransformFunction) xsltSort;break; |
- case XSLT_FUNC_TEXT: |
- cur->func = (xsltTransformFunction) xsltText;break; |
- case XSLT_FUNC_ELEMENT: |
- cur->func = (xsltTransformFunction) xsltElement;break; |
- case XSLT_FUNC_ATTRIBUTE: |
- cur->func = (xsltTransformFunction) xsltAttribute;break; |
- case XSLT_FUNC_COMMENT: |
- cur->func = (xsltTransformFunction) xsltComment;break; |
- case XSLT_FUNC_PI: |
- cur->func = (xsltTransformFunction) xsltProcessingInstruction; |
- break; |
- case XSLT_FUNC_COPYOF: |
- cur->func = (xsltTransformFunction) xsltCopyOf;break; |
- case XSLT_FUNC_VALUEOF: |
- cur->func = (xsltTransformFunction) xsltValueOf;break; |
- case XSLT_FUNC_NUMBER: |
- cur->func = (xsltTransformFunction) xsltNumber;break; |
- case XSLT_FUNC_APPLYIMPORTS: |
- cur->func = (xsltTransformFunction) xsltApplyImports;break; |
- case XSLT_FUNC_CALLTEMPLATE: |
- cur->func = (xsltTransformFunction) xsltCallTemplate;break; |
- case XSLT_FUNC_APPLYTEMPLATES: |
- cur->func = (xsltTransformFunction) xsltApplyTemplates;break; |
- case XSLT_FUNC_CHOOSE: |
- cur->func = (xsltTransformFunction) xsltChoose;break; |
- case XSLT_FUNC_IF: |
- cur->func = (xsltTransformFunction) xsltIf;break; |
- case XSLT_FUNC_FOREACH: |
- cur->func = (xsltTransformFunction) xsltForEach;break; |
- case XSLT_FUNC_DOCUMENT: |
- cur->func = (xsltTransformFunction) xsltDocumentElem;break; |
- case XSLT_FUNC_WITHPARAM: |
- case XSLT_FUNC_PARAM: |
- case XSLT_FUNC_VARIABLE: |
- case XSLT_FUNC_WHEN: |
- break; |
- default: |
- if (cur->func == NULL) { |
- xsltTransformError(NULL, style, NULL, |
- "xsltNewStylePreComp : no function for type %d\n", type); |
- style->errors++; |
- } |
- } |
- cur->next = style->preComps; |
- style->preComps = (xsltElemPreCompPtr) cur; |
- |
- return(cur); |
-} |
- |
-/** |
- * xsltFreeStylePreComp: |
- * @comp: an XSLT Style precomputed block |
- * |
- * Free up the memory allocated by @comp |
- */ |
-static void |
-xsltFreeStylePreComp(xsltStylePreCompPtr comp) { |
- if (comp == NULL) |
- return; |
-#ifdef XSLT_REFACTORED |
- /* |
- * URGENT TODO: Implement destructors. |
- */ |
- switch (comp->type) { |
- case XSLT_FUNC_LITERAL_RESULT_ELEMENT: |
- break; |
- case XSLT_FUNC_COPY: |
- break; |
- case XSLT_FUNC_SORT: { |
- xsltStyleItemSortPtr item = (xsltStyleItemSortPtr) comp; |
- if (item->locale != (xsltLocale)0) |
- xsltFreeLocale(item->locale); |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_TEXT: |
- break; |
- case XSLT_FUNC_ELEMENT: |
- break; |
- case XSLT_FUNC_ATTRIBUTE: |
- break; |
- case XSLT_FUNC_COMMENT: |
- break; |
- case XSLT_FUNC_PI: |
- break; |
- case XSLT_FUNC_COPYOF: { |
- xsltStyleItemCopyOfPtr item = (xsltStyleItemCopyOfPtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_VALUEOF: { |
- xsltStyleItemValueOfPtr item = (xsltStyleItemValueOfPtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_NUMBER: { |
- xsltStyleItemNumberPtr item = (xsltStyleItemNumberPtr) comp; |
- if (item->numdata.countPat != NULL) |
- xsltFreeCompMatchList(item->numdata.countPat); |
- if (item->numdata.fromPat != NULL) |
- xsltFreeCompMatchList(item->numdata.fromPat); |
- } |
- break; |
- case XSLT_FUNC_APPLYIMPORTS: |
- break; |
- case XSLT_FUNC_CALLTEMPLATE: |
- break; |
- case XSLT_FUNC_APPLYTEMPLATES: { |
- xsltStyleItemApplyTemplatesPtr item = |
- (xsltStyleItemApplyTemplatesPtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_CHOOSE: |
- break; |
- case XSLT_FUNC_IF: { |
- xsltStyleItemIfPtr item = (xsltStyleItemIfPtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_FOREACH: { |
- xsltStyleItemForEachPtr item = |
- (xsltStyleItemForEachPtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_DOCUMENT: |
- break; |
- case XSLT_FUNC_WITHPARAM: { |
- xsltStyleItemWithParamPtr item = |
- (xsltStyleItemWithParamPtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_PARAM: { |
- xsltStyleItemParamPtr item = |
- (xsltStyleItemParamPtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_VARIABLE: { |
- xsltStyleItemVariablePtr item = |
- (xsltStyleItemVariablePtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_WHEN: { |
- xsltStyleItemWhenPtr item = |
- (xsltStyleItemWhenPtr) comp; |
- if (item->comp != NULL) |
- xmlXPathFreeCompExpr(item->comp); |
- } |
- break; |
- case XSLT_FUNC_OTHERWISE: |
- case XSLT_FUNC_FALLBACK: |
- case XSLT_FUNC_MESSAGE: |
- case XSLT_FUNC_INCLUDE: |
- case XSLT_FUNC_ATTRSET: |
- |
- break; |
- default: |
- /* TODO: Raise error. */ |
- break; |
- } |
-#else |
- if (comp->locale != (xsltLocale)0) |
- xsltFreeLocale(comp->locale); |
- if (comp->comp != NULL) |
- xmlXPathFreeCompExpr(comp->comp); |
- if (comp->numdata.countPat != NULL) |
- xsltFreeCompMatchList(comp->numdata.countPat); |
- if (comp->numdata.fromPat != NULL) |
- xsltFreeCompMatchList(comp->numdata.fromPat); |
- if (comp->nsList != NULL) |
- xmlFree(comp->nsList); |
-#endif |
- |
- xmlFree(comp); |
-} |
- |
- |
-/************************************************************************ |
- * * |
- * XSLT-1.1 extensions * |
- * * |
- ************************************************************************/ |
- |
-/** |
- * xsltDocumentComp: |
- * @style: the XSLT stylesheet |
- * @inst: the instruction in the stylesheet |
- * @function: unused |
- * |
- * Pre process an XSLT-1.1 document element |
- * |
- * Returns a precompiled data structure for the element |
- */ |
-xsltElemPreCompPtr |
-xsltDocumentComp(xsltStylesheetPtr style, xmlNodePtr inst, |
- xsltTransformFunction function ATTRIBUTE_UNUSED) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemDocumentPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- const xmlChar *filename = NULL; |
- |
- /* |
- * As of 2006-03-30, this function is currently defined in Libxslt |
- * to be used for: |
- * (in libxslt/extra.c) |
- * "output" in XSLT_SAXON_NAMESPACE |
- * "write" XSLT_XALAN_NAMESPACE |
- * "document" XSLT_XT_NAMESPACE |
- * "document" XSLT_NAMESPACE (from the abandoned old working |
- * draft of XSLT 1.1) |
- * (in libexslt/common.c) |
- * "document" in EXSLT_COMMON_NAMESPACE |
- */ |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemDocumentPtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_DOCUMENT); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_DOCUMENT); |
-#endif |
- |
- if (comp == NULL) |
- return (NULL); |
- comp->inst = inst; |
- comp->ver11 = 0; |
- |
- if (xmlStrEqual(inst->name, (const xmlChar *) "output")) { |
-#ifdef WITH_XSLT_DEBUG_EXTRA |
- xsltGenericDebug(xsltGenericDebugContext, |
- "Found saxon:output extension\n"); |
-#endif |
- /* |
- * The element "output" is in the namespace XSLT_SAXON_NAMESPACE |
- * (http://icl.com/saxon) |
- * The @file is in no namespace; it is an AVT. |
- * (http://www.computerwizards.com/saxon/doc/extensions.html#saxon:output) |
- * |
- * TODO: Do we need not to check the namespace here? |
- */ |
- filename = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"file", |
- NULL, &comp->has_filename); |
- } else if (xmlStrEqual(inst->name, (const xmlChar *) "write")) { |
-#ifdef WITH_XSLT_DEBUG_EXTRA |
- xsltGenericDebug(xsltGenericDebugContext, |
- "Found xalan:write extension\n"); |
-#endif |
- /* the filename need to be interpreted */ |
- /* |
- * TODO: Is "filename need to be interpreted" meant to be a todo? |
- * Where will be the filename of xalan:write be processed? |
- * |
- * TODO: Do we need not to check the namespace here? |
- * The extension ns is "http://xml.apache.org/xalan/redirect". |
- * See http://xml.apache.org/xalan-j/extensionslib.html. |
- */ |
- } else if (xmlStrEqual(inst->name, (const xmlChar *) "document")) { |
- if (inst->ns != NULL) { |
- if (xmlStrEqual(inst->ns->href, XSLT_NAMESPACE)) { |
- /* |
- * Mark the instruction as being of |
- * XSLT version 1.1 (abandoned). |
- */ |
- comp->ver11 = 1; |
-#ifdef WITH_XSLT_DEBUG_EXTRA |
- xsltGenericDebug(xsltGenericDebugContext, |
- "Found xslt11:document construct\n"); |
-#endif |
- } else { |
- if (xmlStrEqual(inst->ns->href, |
- (const xmlChar *)"http://exslt.org/common")) { |
- /* EXSLT. */ |
-#ifdef WITH_XSLT_DEBUG_EXTRA |
- xsltGenericDebug(xsltGenericDebugContext, |
- "Found exslt:document extension\n"); |
-#endif |
- } else if (xmlStrEqual(inst->ns->href, XSLT_XT_NAMESPACE)) { |
- /* James Clark's XT. */ |
-#ifdef WITH_XSLT_DEBUG_EXTRA |
- xsltGenericDebug(xsltGenericDebugContext, |
- "Found xt:document extension\n"); |
-#endif |
- } |
- } |
- } |
- /* |
- * The element "document" is used in conjunction with the |
- * following namespaces: |
- * |
- * 1) XSLT_NAMESPACE (http://www.w3.org/1999/XSL/Transform version 1.1) |
- * <!ELEMENT xsl:document %template;> |
- * <!ATTLIST xsl:document |
- * href %avt; #REQUIRED |
- * @href is an AVT |
- * IMPORTANT: xsl:document was in the abandoned XSLT 1.1 draft, |
- * it was removed and isn't available in XSLT 1.1 anymore. |
- * In XSLT 2.0 it was renamed to xsl:result-document. |
- * |
- * All other attributes are identical to the attributes |
- * on xsl:output |
- * |
- * 2) EXSLT_COMMON_NAMESPACE (http://exslt.org/common) |
- * <exsl:document |
- * href = { uri-reference } |
- * TODO: is @href is an AVT? |
- * |
- * 3) XSLT_XT_NAMESPACE (http://www.jclark.com/xt) |
- * Example: <xt:document method="xml" href="myFile.xml"> |
- * TODO: is @href is an AVT? |
- * |
- * In all cases @href is in no namespace. |
- */ |
- filename = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"href", NULL, &comp->has_filename); |
- } |
- if (!comp->has_filename) { |
- goto error; |
- } |
- comp->filename = filename; |
- |
-error: |
- return ((xsltElemPreCompPtr) comp); |
-} |
- |
-/************************************************************************ |
- * * |
- * Most of the XSLT-1.0 transformations * |
- * * |
- ************************************************************************/ |
- |
-/** |
- * xsltSortComp: |
- * @style: the XSLT stylesheet |
- * @inst: the xslt sort node |
- * |
- * Process the xslt sort node on the source node |
- */ |
-static void |
-xsltSortComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemSortPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemSortPtr) xsltNewStylePreComp(style, XSLT_FUNC_SORT); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_SORT); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- comp->stype = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"data-type", |
- NULL, &comp->has_stype); |
- if (comp->stype != NULL) { |
- if (xmlStrEqual(comp->stype, (const xmlChar *) "text")) |
- comp->number = 0; |
- else if (xmlStrEqual(comp->stype, (const xmlChar *) "number")) |
- comp->number = 1; |
- else { |
- xsltTransformError(NULL, style, inst, |
- "xsltSortComp: no support for data-type = %s\n", comp->stype); |
- comp->number = 0; /* use default */ |
- if (style != NULL) style->warnings++; |
- } |
- } |
- comp->order = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"order", |
- NULL, &comp->has_order); |
- if (comp->order != NULL) { |
- if (xmlStrEqual(comp->order, (const xmlChar *) "ascending")) |
- comp->descending = 0; |
- else if (xmlStrEqual(comp->order, (const xmlChar *) "descending")) |
- comp->descending = 1; |
- else { |
- xsltTransformError(NULL, style, inst, |
- "xsltSortComp: invalid value %s for order\n", comp->order); |
- comp->descending = 0; /* use default */ |
- if (style != NULL) style->warnings++; |
- } |
- } |
- comp->case_order = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"case-order", |
- NULL, &comp->has_use); |
- if (comp->case_order != NULL) { |
- if (xmlStrEqual(comp->case_order, (const xmlChar *) "upper-first")) |
- comp->lower_first = 0; |
- else if (xmlStrEqual(comp->case_order, (const xmlChar *) "lower-first")) |
- comp->lower_first = 1; |
- else { |
- xsltTransformError(NULL, style, inst, |
- "xsltSortComp: invalid value %s for order\n", comp->order); |
- comp->lower_first = 0; /* use default */ |
- if (style != NULL) style->warnings++; |
- } |
- } |
- |
- comp->lang = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"lang", |
- NULL, &comp->has_lang); |
- if (comp->lang != NULL) { |
- comp->locale = xsltNewLocale(comp->lang); |
- } |
- else { |
- comp->locale = (xsltLocale)0; |
- } |
- |
- comp->select = xsltGetCNsProp(style, inst,(const xmlChar *)"select", XSLT_NAMESPACE); |
- if (comp->select == NULL) { |
- /* |
- * The default value of the select attribute is ., which will |
- * cause the string-value of the current node to be used as |
- * the sort key. |
- */ |
- comp->select = xmlDictLookup(style->dict, BAD_CAST ".", 1); |
- } |
- comp->comp = xsltXPathCompile(style, comp->select); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsltSortComp: could not compile select expression '%s'\n", |
- comp->select); |
- if (style != NULL) style->errors++; |
- } |
- if (inst->children != NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:sort : is not empty\n"); |
- if (style != NULL) style->errors++; |
- } |
-} |
- |
-/** |
- * xsltCopyComp: |
- * @style: the XSLT stylesheet |
- * @inst: the xslt copy node |
- * |
- * Process the xslt copy node on the source node |
- */ |
-static void |
-xsltCopyComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemCopyPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemCopyPtr) xsltNewStylePreComp(style, XSLT_FUNC_COPY); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_COPY); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- |
- comp->use = xsltGetCNsProp(style, inst, (const xmlChar *)"use-attribute-sets", |
- XSLT_NAMESPACE); |
- if (comp->use == NULL) |
- comp->has_use = 0; |
- else |
- comp->has_use = 1; |
-} |
- |
-#ifdef XSLT_REFACTORED |
- /* Enable if ever needed for xsl:text. */ |
-#else |
-/** |
- * xsltTextComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt text node |
- * |
- * TODO: This function is obsolete, since xsl:text won't |
- * be compiled, but removed from the tree. |
- * |
- * Process the xslt text node on the source node |
- */ |
-static void |
-xsltTextComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemTextPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- const xmlChar *prop; |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemTextPtr) xsltNewStylePreComp(style, XSLT_FUNC_TEXT); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_TEXT); |
-#endif |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- comp->noescape = 0; |
- |
- prop = xsltGetCNsProp(style, inst, |
- (const xmlChar *)"disable-output-escaping", |
- XSLT_NAMESPACE); |
- if (prop != NULL) { |
- if (xmlStrEqual(prop, (const xmlChar *)"yes")) { |
- comp->noescape = 1; |
- } else if (!xmlStrEqual(prop, |
- (const xmlChar *)"no")){ |
- xsltTransformError(NULL, style, inst, |
- "xsl:text: disable-output-escaping allows only yes or no\n"); |
- if (style != NULL) style->warnings++; |
- } |
- } |
-} |
-#endif /* else of XSLT_REFACTORED */ |
- |
-/** |
- * xsltElementComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt element node |
- * |
- * Process the xslt element node on the source node |
- */ |
-static void |
-xsltElementComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemElementPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- /* |
- * <xsl:element |
- * name = { qname } |
- * namespace = { uri-reference } |
- * use-attribute-sets = qnames> |
- * <!-- Content: template --> |
- * </xsl:element> |
- */ |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemElementPtr) xsltNewStylePreComp(style, XSLT_FUNC_ELEMENT); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_ELEMENT); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- /* |
- * Attribute "name". |
- */ |
- /* |
- * TODO: Precompile the AVT. See bug #344894. |
- */ |
- comp->name = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"name", NULL, &comp->has_name); |
- if (! comp->has_name) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:element: The attribute 'name' is missing.\n"); |
- style->errors++; |
- goto error; |
- } |
- /* |
- * Attribute "namespace". |
- */ |
- /* |
- * TODO: Precompile the AVT. See bug #344894. |
- */ |
- comp->ns = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"namespace", NULL, &comp->has_ns); |
- |
- if (comp->name != NULL) { |
- if (xmlValidateQName(comp->name, 0)) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:element: The value '%s' of the attribute 'name' is " |
- "not a valid QName.\n", comp->name); |
- style->errors++; |
- } else { |
- const xmlChar *prefix = NULL, *name; |
- |
- name = xsltSplitQName(style->dict, comp->name, &prefix); |
- if (comp->has_ns == 0) { |
- xmlNsPtr ns; |
- |
- /* |
- * SPEC XSLT 1.0: |
- * "If the namespace attribute is not present, then the QName is |
- * expanded into an expanded-name using the namespace declarations |
- * in effect for the xsl:element element, including any default |
- * namespace declaration. |
- */ |
- ns = xmlSearchNs(inst->doc, inst, prefix); |
- if (ns != NULL) { |
- comp->ns = xmlDictLookup(style->dict, ns->href, -1); |
- comp->has_ns = 1; |
-#ifdef XSLT_REFACTORED |
- comp->nsPrefix = prefix; |
- comp->name = name; |
-#else |
- (void)name; /* Suppress unused variable warning. */ |
-#endif |
- } else if (prefix != NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:element: The prefixed QName '%s' " |
- "has no namespace binding in scope in the " |
- "stylesheet; this is an error, since the namespace was " |
- "not specified by the instruction itself.\n", comp->name); |
- style->errors++; |
- } |
- } |
- if ((prefix != NULL) && |
- (!xmlStrncasecmp(prefix, (xmlChar *)"xml", 3))) |
- { |
- /* |
- * Mark is to be skipped. |
- */ |
- comp->has_name = 0; |
- } |
- } |
- } |
- /* |
- * Attribute "use-attribute-sets", |
- */ |
- comp->use = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"use-attribute-sets", |
- NULL, &comp->has_use); |
- |
-error: |
- return; |
-} |
- |
-/** |
- * xsltAttributeComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt attribute node |
- * |
- * Process the xslt attribute node on the source node |
- */ |
-static void |
-xsltAttributeComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemAttributePtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- /* |
- * <xsl:attribute |
- * name = { qname } |
- * namespace = { uri-reference }> |
- * <!-- Content: template --> |
- * </xsl:attribute> |
- */ |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemAttributePtr) xsltNewStylePreComp(style, |
- XSLT_FUNC_ATTRIBUTE); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_ATTRIBUTE); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- /* |
- * Attribute "name". |
- */ |
- /* |
- * TODO: Precompile the AVT. See bug #344894. |
- */ |
- comp->name = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"name", |
- NULL, &comp->has_name); |
- if (! comp->has_name) { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-attribute: The attribute 'name' is missing.\n"); |
- style->errors++; |
- return; |
- } |
- /* |
- * Attribute "namespace". |
- */ |
- /* |
- * TODO: Precompile the AVT. See bug #344894. |
- */ |
- comp->ns = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"namespace", |
- NULL, &comp->has_ns); |
- |
- if (comp->name != NULL) { |
- if (xmlValidateQName(comp->name, 0)) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:attribute: The value '%s' of the attribute 'name' is " |
- "not a valid QName.\n", comp->name); |
- style->errors++; |
- } else if (xmlStrEqual(comp->name, BAD_CAST "xmlns")) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:attribute: The attribute name 'xmlns' is not allowed.\n"); |
- style->errors++; |
- } else { |
- const xmlChar *prefix = NULL, *name; |
- |
- name = xsltSplitQName(style->dict, comp->name, &prefix); |
- if (prefix != NULL) { |
- if (comp->has_ns == 0) { |
- xmlNsPtr ns; |
- |
- /* |
- * SPEC XSLT 1.0: |
- * "If the namespace attribute is not present, then the |
- * QName is expanded into an expanded-name using the |
- * namespace declarations in effect for the xsl:element |
- * element, including any default namespace declaration. |
- */ |
- ns = xmlSearchNs(inst->doc, inst, prefix); |
- if (ns != NULL) { |
- comp->ns = xmlDictLookup(style->dict, ns->href, -1); |
- comp->has_ns = 1; |
-#ifdef XSLT_REFACTORED |
- comp->nsPrefix = prefix; |
- comp->name = name; |
-#else |
- (void)name; /* Suppress unused variable warning. */ |
-#endif |
- } else { |
- xsltTransformError(NULL, style, inst, |
- "xsl:attribute: The prefixed QName '%s' " |
- "has no namespace binding in scope in the " |
- "stylesheet; this is an error, since the " |
- "namespace was not specified by the instruction " |
- "itself.\n", comp->name); |
- style->errors++; |
- } |
- } |
- } |
- } |
- } |
-} |
- |
-/** |
- * xsltCommentComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt comment node |
- * |
- * Process the xslt comment node on the source node |
- */ |
-static void |
-xsltCommentComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemCommentPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemCommentPtr) xsltNewStylePreComp(style, XSLT_FUNC_COMMENT); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_COMMENT); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
-} |
- |
-/** |
- * xsltProcessingInstructionComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt processing-instruction node |
- * |
- * Process the xslt processing-instruction node on the source node |
- */ |
-static void |
-xsltProcessingInstructionComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemPIPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemPIPtr) xsltNewStylePreComp(style, XSLT_FUNC_PI); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_PI); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- comp->name = xsltEvalStaticAttrValueTemplate(style, inst, |
- (const xmlChar *)"name", |
- XSLT_NAMESPACE, &comp->has_name); |
-} |
- |
-/** |
- * xsltCopyOfComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt copy-of node |
- * |
- * Process the xslt copy-of node on the source node |
- */ |
-static void |
-xsltCopyOfComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemCopyOfPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemCopyOfPtr) xsltNewStylePreComp(style, XSLT_FUNC_COPYOF); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_COPYOF); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- comp->select = xsltGetCNsProp(style, inst, (const xmlChar *)"select", |
- XSLT_NAMESPACE); |
- if (comp->select == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:copy-of : select is missing\n"); |
- if (style != NULL) style->errors++; |
- return; |
- } |
- comp->comp = xsltXPathCompile(style, comp->select); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:copy-of : could not compile select expression '%s'\n", |
- comp->select); |
- if (style != NULL) style->errors++; |
- } |
-} |
- |
-/** |
- * xsltValueOfComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt value-of node |
- * |
- * Process the xslt value-of node on the source node |
- */ |
-static void |
-xsltValueOfComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemValueOfPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- const xmlChar *prop; |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemValueOfPtr) xsltNewStylePreComp(style, XSLT_FUNC_VALUEOF); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_VALUEOF); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- prop = xsltGetCNsProp(style, inst, |
- (const xmlChar *)"disable-output-escaping", |
- XSLT_NAMESPACE); |
- if (prop != NULL) { |
- if (xmlStrEqual(prop, (const xmlChar *)"yes")) { |
- comp->noescape = 1; |
- } else if (!xmlStrEqual(prop, |
- (const xmlChar *)"no")){ |
- xsltTransformError(NULL, style, inst, |
-"xsl:value-of : disable-output-escaping allows only yes or no\n"); |
- if (style != NULL) style->warnings++; |
- } |
- } |
- comp->select = xsltGetCNsProp(style, inst, (const xmlChar *)"select", |
- XSLT_NAMESPACE); |
- if (comp->select == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:value-of : select is missing\n"); |
- if (style != NULL) style->errors++; |
- return; |
- } |
- comp->comp = xsltXPathCompile(style, comp->select); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:value-of : could not compile select expression '%s'\n", |
- comp->select); |
- if (style != NULL) style->errors++; |
- } |
-} |
- |
-static void |
-xsltGetQNameProperty(xsltStylesheetPtr style, xmlNodePtr inst, |
- const xmlChar *propName, |
- int mandatory, |
- int *hasProp, const xmlChar **nsName, |
- const xmlChar** localName) |
-{ |
- const xmlChar *prop; |
- |
- if (nsName) |
- *nsName = NULL; |
- if (localName) |
- *localName = NULL; |
- if (hasProp) |
- *hasProp = 0; |
- |
- prop = xsltGetCNsProp(style, inst, propName, XSLT_NAMESPACE); |
- if (prop == NULL) { |
- if (mandatory) { |
- xsltTransformError(NULL, style, inst, |
- "The attribute '%s' is missing.\n", propName); |
- style->errors++; |
- return; |
- } |
- } else { |
- const xmlChar *URI; |
- |
- if (xmlValidateQName(prop, 0)) { |
- xsltTransformError(NULL, style, inst, |
- "The value '%s' of the attribute " |
- "'%s' is not a valid QName.\n", prop, propName); |
- style->errors++; |
- return; |
- } else { |
- /* |
- * @prop will be in the string dict afterwards, @URI not. |
- */ |
- URI = xsltGetQNameURI2(style, inst, &prop); |
- if (prop == NULL) { |
- style->errors++; |
- } else { |
- if (localName) |
- *localName = prop; |
- if (hasProp) |
- *hasProp = 1; |
- if (URI != NULL) { |
- /* |
- * Fixes bug #308441: Put the ns-name in the dict |
- * in order to pointer compare names during XPath's |
- * variable lookup. |
- */ |
- if (nsName) |
- *nsName = xmlDictLookup(style->dict, URI, -1); |
- /* comp->has_ns = 1; */ |
- } |
- } |
- } |
- } |
- return; |
-} |
- |
-/** |
- * xsltWithParamComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt with-param node |
- * |
- * Process the xslt with-param node on the source node |
- * Allowed parents: xsl:call-template, xsl:apply-templates. |
- * <xsl:with-param |
- * name = qname |
- * select = expression> |
- * <!-- Content: template --> |
- * </xsl:with-param> |
- */ |
-static void |
-xsltWithParamComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemWithParamPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemWithParamPtr) xsltNewStylePreComp(style, XSLT_FUNC_WITHPARAM); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_WITHPARAM); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- /* |
- * Attribute "name". |
- */ |
- xsltGetQNameProperty(style, inst, BAD_CAST "name", |
- 1, &(comp->has_name), &(comp->ns), &(comp->name)); |
- if (comp->ns) |
- comp->has_ns = 1; |
- /* |
- * Attribute "select". |
- */ |
- comp->select = xsltGetCNsProp(style, inst, (const xmlChar *)"select", |
- XSLT_NAMESPACE); |
- if (comp->select != NULL) { |
- comp->comp = xsltXPathCompile(style, comp->select); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-with-param: Failed to compile select " |
- "expression '%s'\n", comp->select); |
- style->errors++; |
- } |
- if (inst->children != NULL) { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-with-param: The content should be empty since " |
- "the attribute select is present.\n"); |
- style->warnings++; |
- } |
- } |
-} |
- |
-/** |
- * xsltNumberComp: |
- * @style: an XSLT compiled stylesheet |
- * @cur: the xslt number node |
- * |
- * Process the xslt number node on the source node |
- */ |
-static void |
-xsltNumberComp(xsltStylesheetPtr style, xmlNodePtr cur) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemNumberPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- const xmlChar *prop; |
- |
- if ((style == NULL) || (cur == NULL) || (cur->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemNumberPtr) xsltNewStylePreComp(style, XSLT_FUNC_NUMBER); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_NUMBER); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- cur->psvi = comp; |
- |
- comp->numdata.doc = cur->doc; |
- comp->numdata.node = cur; |
- comp->numdata.value = xsltGetCNsProp(style, cur, (const xmlChar *)"value", |
- XSLT_NAMESPACE); |
- |
- prop = xsltEvalStaticAttrValueTemplate(style, cur, |
- (const xmlChar *)"format", |
- XSLT_NAMESPACE, &comp->numdata.has_format); |
- if (comp->numdata.has_format == 0) { |
- comp->numdata.format = xmlDictLookup(style->dict, BAD_CAST "" , 0); |
- } else { |
- comp->numdata.format = prop; |
- } |
- |
- comp->numdata.count = xsltGetCNsProp(style, cur, (const xmlChar *)"count", |
- XSLT_NAMESPACE); |
- comp->numdata.from = xsltGetCNsProp(style, cur, (const xmlChar *)"from", |
- XSLT_NAMESPACE); |
- |
- prop = xsltGetCNsProp(style, cur, (const xmlChar *)"count", XSLT_NAMESPACE); |
- if (prop != NULL) { |
- comp->numdata.countPat = xsltCompilePattern(prop, cur->doc, cur, style, |
- NULL); |
- } |
- |
- prop = xsltGetCNsProp(style, cur, (const xmlChar *)"from", XSLT_NAMESPACE); |
- if (prop != NULL) { |
- comp->numdata.fromPat = xsltCompilePattern(prop, cur->doc, cur, style, |
- NULL); |
- } |
- |
- prop = xsltGetCNsProp(style, cur, (const xmlChar *)"level", XSLT_NAMESPACE); |
- if (prop != NULL) { |
- if (xmlStrEqual(prop, BAD_CAST("single")) || |
- xmlStrEqual(prop, BAD_CAST("multiple")) || |
- xmlStrEqual(prop, BAD_CAST("any"))) { |
- comp->numdata.level = prop; |
- } else { |
- xsltTransformError(NULL, style, cur, |
- "xsl:number : invalid value %s for level\n", prop); |
- if (style != NULL) style->warnings++; |
- } |
- } |
- |
- prop = xsltGetCNsProp(style, cur, (const xmlChar *)"lang", XSLT_NAMESPACE); |
- if (prop != NULL) { |
- xsltTransformError(NULL, style, cur, |
- "xsl:number : lang attribute not implemented\n"); |
- XSLT_TODO; /* xsl:number lang attribute */ |
- } |
- |
- prop = xsltGetCNsProp(style, cur, (const xmlChar *)"letter-value", XSLT_NAMESPACE); |
- if (prop != NULL) { |
- if (xmlStrEqual(prop, BAD_CAST("alphabetic"))) { |
- xsltTransformError(NULL, style, cur, |
- "xsl:number : letter-value 'alphabetic' not implemented\n"); |
- if (style != NULL) style->warnings++; |
- XSLT_TODO; /* xsl:number letter-value attribute alphabetic */ |
- } else if (xmlStrEqual(prop, BAD_CAST("traditional"))) { |
- xsltTransformError(NULL, style, cur, |
- "xsl:number : letter-value 'traditional' not implemented\n"); |
- if (style != NULL) style->warnings++; |
- XSLT_TODO; /* xsl:number letter-value attribute traditional */ |
- } else { |
- xsltTransformError(NULL, style, cur, |
- "xsl:number : invalid value %s for letter-value\n", prop); |
- if (style != NULL) style->warnings++; |
- } |
- } |
- |
- prop = xsltGetCNsProp(style, cur, (const xmlChar *)"grouping-separator", |
- XSLT_NAMESPACE); |
- if (prop != NULL) { |
- comp->numdata.groupingCharacterLen = xmlStrlen(prop); |
- comp->numdata.groupingCharacter = |
- xsltGetUTF8Char(prop, &(comp->numdata.groupingCharacterLen)); |
- } |
- |
- prop = xsltGetCNsProp(style, cur, (const xmlChar *)"grouping-size", XSLT_NAMESPACE); |
- if (prop != NULL) { |
- sscanf((char *)prop, "%d", &comp->numdata.digitsPerGroup); |
- } else { |
- comp->numdata.groupingCharacter = 0; |
- } |
- |
- /* Set default values */ |
- if (comp->numdata.value == NULL) { |
- if (comp->numdata.level == NULL) { |
- comp->numdata.level = xmlDictLookup(style->dict, |
- BAD_CAST"single", 6); |
- } |
- } |
- |
-} |
- |
-/** |
- * xsltApplyImportsComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt apply-imports node |
- * |
- * Process the xslt apply-imports node on the source node |
- */ |
-static void |
-xsltApplyImportsComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemApplyImportsPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemApplyImportsPtr) xsltNewStylePreComp(style, XSLT_FUNC_APPLYIMPORTS); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_APPLYIMPORTS); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
-} |
- |
-/** |
- * xsltCallTemplateComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt call-template node |
- * |
- * Process the xslt call-template node on the source node |
- */ |
-static void |
-xsltCallTemplateComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemCallTemplatePtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemCallTemplatePtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_CALLTEMPLATE); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_CALLTEMPLATE); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- /* |
- * Attribute "name". |
- */ |
- xsltGetQNameProperty(style, inst, BAD_CAST "name", |
- 1, &(comp->has_name), &(comp->ns), &(comp->name)); |
- if (comp->ns) |
- comp->has_ns = 1; |
-} |
- |
-/** |
- * xsltApplyTemplatesComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the apply-templates node |
- * |
- * Process the apply-templates node on the source node |
- */ |
-static void |
-xsltApplyTemplatesComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemApplyTemplatesPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemApplyTemplatesPtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_APPLYTEMPLATES); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_APPLYTEMPLATES); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- /* |
- * Attribute "mode". |
- */ |
- xsltGetQNameProperty(style, inst, BAD_CAST "mode", |
- 0, NULL, &(comp->modeURI), &(comp->mode)); |
- /* |
- * Attribute "select". |
- */ |
- comp->select = xsltGetCNsProp(style, inst, BAD_CAST "select", |
- XSLT_NAMESPACE); |
- if (comp->select != NULL) { |
- comp->comp = xsltXPathCompile(style, comp->select); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-apply-templates: could not compile select " |
- "expression '%s'\n", comp->select); |
- style->errors++; |
- } |
- } |
- /* TODO: handle (or skip) the xsl:sort and xsl:with-param */ |
-} |
- |
-/** |
- * xsltChooseComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt choose node |
- * |
- * Process the xslt choose node on the source node |
- */ |
-static void |
-xsltChooseComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemChoosePtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemChoosePtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_CHOOSE); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_CHOOSE); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
-} |
- |
-/** |
- * xsltIfComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt if node |
- * |
- * Process the xslt if node on the source node |
- */ |
-static void |
-xsltIfComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemIfPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemIfPtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_IF); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_IF); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- comp->test = xsltGetCNsProp(style, inst, (const xmlChar *)"test", XSLT_NAMESPACE); |
- if (comp->test == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:if : test is not defined\n"); |
- if (style != NULL) style->errors++; |
- return; |
- } |
- comp->comp = xsltXPathCompile(style, comp->test); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:if : could not compile test expression '%s'\n", |
- comp->test); |
- if (style != NULL) style->errors++; |
- } |
-} |
- |
-/** |
- * xsltWhenComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt if node |
- * |
- * Process the xslt if node on the source node |
- */ |
-static void |
-xsltWhenComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemWhenPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemWhenPtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_WHEN); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_WHEN); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- comp->test = xsltGetCNsProp(style, inst, (const xmlChar *)"test", XSLT_NAMESPACE); |
- if (comp->test == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:when : test is not defined\n"); |
- if (style != NULL) style->errors++; |
- return; |
- } |
- comp->comp = xsltXPathCompile(style, comp->test); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:when : could not compile test expression '%s'\n", |
- comp->test); |
- if (style != NULL) style->errors++; |
- } |
-} |
- |
-/** |
- * xsltForEachComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt for-each node |
- * |
- * Process the xslt for-each node on the source node |
- */ |
-static void |
-xsltForEachComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemForEachPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemForEachPtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_FOREACH); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_FOREACH); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- comp->select = xsltGetCNsProp(style, inst, (const xmlChar *)"select", |
- XSLT_NAMESPACE); |
- if (comp->select == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:for-each : select is missing\n"); |
- if (style != NULL) style->errors++; |
- } else { |
- comp->comp = xsltXPathCompile(style, comp->select); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "xsl:for-each : could not compile select expression '%s'\n", |
- comp->select); |
- if (style != NULL) style->errors++; |
- } |
- } |
- /* TODO: handle and skip the xsl:sort */ |
-} |
- |
-/** |
- * xsltVariableComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt variable node |
- * |
- * Process the xslt variable node on the source node |
- */ |
-static void |
-xsltVariableComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemVariablePtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemVariablePtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_VARIABLE); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_VARIABLE); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- |
- inst->psvi = comp; |
- comp->inst = inst; |
- /* |
- * The full template resolution can be done statically |
- */ |
- |
- /* |
- * Attribute "name". |
- */ |
- xsltGetQNameProperty(style, inst, BAD_CAST "name", |
- 1, &(comp->has_name), &(comp->ns), &(comp->name)); |
- if (comp->ns) |
- comp->has_ns = 1; |
- /* |
- * Attribute "select". |
- */ |
- comp->select = xsltGetCNsProp(style, inst, (const xmlChar *)"select", |
- XSLT_NAMESPACE); |
- if (comp->select != NULL) { |
-#ifndef XSLT_REFACTORED |
- xmlNodePtr cur; |
-#endif |
- comp->comp = xsltXPathCompile(style, comp->select); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-variable: Failed to compile the XPath expression '%s'.\n", |
- comp->select); |
- style->errors++; |
- } |
-#ifdef XSLT_REFACTORED |
- if (inst->children != NULL) { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-variable: There must be no child nodes, since the " |
- "attribute 'select' was specified.\n"); |
- style->errors++; |
- } |
-#else |
- for (cur = inst->children; cur != NULL; cur = cur->next) { |
- if (cur->type != XML_COMMENT_NODE && |
- (cur->type != XML_TEXT_NODE || !xsltIsBlank(cur->content))) |
- { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-variable: There must be no child nodes, since the " |
- "attribute 'select' was specified.\n"); |
- style->errors++; |
- } |
- } |
-#endif |
- } |
-} |
- |
-/** |
- * xsltParamComp: |
- * @style: an XSLT compiled stylesheet |
- * @inst: the xslt param node |
- * |
- * Process the xslt param node on the source node |
- */ |
-static void |
-xsltParamComp(xsltStylesheetPtr style, xmlNodePtr inst) { |
-#ifdef XSLT_REFACTORED |
- xsltStyleItemParamPtr comp; |
-#else |
- xsltStylePreCompPtr comp; |
-#endif |
- |
- if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE)) |
- return; |
- |
-#ifdef XSLT_REFACTORED |
- comp = (xsltStyleItemParamPtr) |
- xsltNewStylePreComp(style, XSLT_FUNC_PARAM); |
-#else |
- comp = xsltNewStylePreComp(style, XSLT_FUNC_PARAM); |
-#endif |
- |
- if (comp == NULL) |
- return; |
- inst->psvi = comp; |
- comp->inst = inst; |
- |
- /* |
- * Attribute "name". |
- */ |
- xsltGetQNameProperty(style, inst, BAD_CAST "name", |
- 1, &(comp->has_name), &(comp->ns), &(comp->name)); |
- if (comp->ns) |
- comp->has_ns = 1; |
- /* |
- * Attribute "select". |
- */ |
- comp->select = xsltGetCNsProp(style, inst, (const xmlChar *)"select", |
- XSLT_NAMESPACE); |
- if (comp->select != NULL) { |
- comp->comp = xsltXPathCompile(style, comp->select); |
- if (comp->comp == NULL) { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-param: could not compile select expression '%s'.\n", |
- comp->select); |
- style->errors++; |
- } |
- if (inst->children != NULL) { |
- xsltTransformError(NULL, style, inst, |
- "XSLT-param: The content should be empty since the " |
- "attribute 'select' is present.\n"); |
- style->warnings++; |
- } |
- } |
-} |
- |
-/************************************************************************ |
- * * |
- * Generic interface * |
- * * |
- ************************************************************************/ |
- |
-/** |
- * xsltFreeStylePreComps: |
- * @style: an XSLT transformation context |
- * |
- * Free up the memory allocated by all precomputed blocks |
- */ |
-void |
-xsltFreeStylePreComps(xsltStylesheetPtr style) { |
- xsltElemPreCompPtr cur, next; |
- |
- if (style == NULL) |
- return; |
- |
- cur = style->preComps; |
- while (cur != NULL) { |
- next = cur->next; |
- if (cur->type == XSLT_FUNC_EXTENSION) |
- cur->free(cur); |
- else |
- xsltFreeStylePreComp((xsltStylePreCompPtr) cur); |
- cur = next; |
- } |
-} |
- |
-#ifdef XSLT_REFACTORED |
- |
-/** |
- * xsltStylePreCompute: |
- * @style: the XSLT stylesheet |
- * @node: the element in the XSLT namespace |
- * |
- * Precompute an XSLT element. |
- * This expects the type of the element to be already |
- * set in style->compCtxt->inode->type; |
- */ |
-void |
-xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr node) { |
- /* |
- * The xsltXSLTElemMarker marker was set beforehand by |
- * the parsing mechanism for all elements in the XSLT namespace. |
- */ |
- if (style == NULL) { |
- if ((node != NULL) && (node->type == XML_ELEMENT_NODE)) |
- node->psvi = NULL; |
- return; |
- } |
- if (node == NULL) |
- return; |
- if (! IS_XSLT_ELEM_FAST(node)) |
- return; |
- |
- node->psvi = NULL; |
- if (XSLT_CCTXT(style)->inode->type != 0) { |
- switch (XSLT_CCTXT(style)->inode->type) { |
- case XSLT_FUNC_APPLYTEMPLATES: |
- xsltApplyTemplatesComp(style, node); |
- break; |
- case XSLT_FUNC_WITHPARAM: |
- xsltWithParamComp(style, node); |
- break; |
- case XSLT_FUNC_VALUEOF: |
- xsltValueOfComp(style, node); |
- break; |
- case XSLT_FUNC_COPY: |
- xsltCopyComp(style, node); |
- break; |
- case XSLT_FUNC_COPYOF: |
- xsltCopyOfComp(style, node); |
- break; |
- case XSLT_FUNC_IF: |
- xsltIfComp(style, node); |
- break; |
- case XSLT_FUNC_CHOOSE: |
- xsltChooseComp(style, node); |
- break; |
- case XSLT_FUNC_WHEN: |
- xsltWhenComp(style, node); |
- break; |
- case XSLT_FUNC_OTHERWISE: |
- /* NOP yet */ |
- return; |
- case XSLT_FUNC_FOREACH: |
- xsltForEachComp(style, node); |
- break; |
- case XSLT_FUNC_APPLYIMPORTS: |
- xsltApplyImportsComp(style, node); |
- break; |
- case XSLT_FUNC_ATTRIBUTE: |
- xsltAttributeComp(style, node); |
- break; |
- case XSLT_FUNC_ELEMENT: |
- xsltElementComp(style, node); |
- break; |
- case XSLT_FUNC_SORT: |
- xsltSortComp(style, node); |
- break; |
- case XSLT_FUNC_COMMENT: |
- xsltCommentComp(style, node); |
- break; |
- case XSLT_FUNC_NUMBER: |
- xsltNumberComp(style, node); |
- break; |
- case XSLT_FUNC_PI: |
- xsltProcessingInstructionComp(style, node); |
- break; |
- case XSLT_FUNC_CALLTEMPLATE: |
- xsltCallTemplateComp(style, node); |
- break; |
- case XSLT_FUNC_PARAM: |
- xsltParamComp(style, node); |
- break; |
- case XSLT_FUNC_VARIABLE: |
- xsltVariableComp(style, node); |
- break; |
- case XSLT_FUNC_FALLBACK: |
- /* NOP yet */ |
- return; |
- case XSLT_FUNC_DOCUMENT: |
- /* The extra one */ |
- node->psvi = (void *) xsltDocumentComp(style, node, |
- (xsltTransformFunction) xsltDocumentElem); |
- break; |
- case XSLT_FUNC_MESSAGE: |
- /* NOP yet */ |
- return; |
- default: |
- /* |
- * NOTE that xsl:text, xsl:template, xsl:stylesheet, |
- * xsl:transform, xsl:import, xsl:include are not expected |
- * to be handed over to this function. |
- */ |
- xsltTransformError(NULL, style, node, |
- "Internal error: (xsltStylePreCompute) cannot handle " |
- "the XSLT element '%s'.\n", node->name); |
- style->errors++; |
- return; |
- } |
- } else { |
- /* |
- * Fallback to string comparison. |
- */ |
- if (IS_XSLT_NAME(node, "apply-templates")) { |
- xsltApplyTemplatesComp(style, node); |
- } else if (IS_XSLT_NAME(node, "with-param")) { |
- xsltWithParamComp(style, node); |
- } else if (IS_XSLT_NAME(node, "value-of")) { |
- xsltValueOfComp(style, node); |
- } else if (IS_XSLT_NAME(node, "copy")) { |
- xsltCopyComp(style, node); |
- } else if (IS_XSLT_NAME(node, "copy-of")) { |
- xsltCopyOfComp(style, node); |
- } else if (IS_XSLT_NAME(node, "if")) { |
- xsltIfComp(style, node); |
- } else if (IS_XSLT_NAME(node, "choose")) { |
- xsltChooseComp(style, node); |
- } else if (IS_XSLT_NAME(node, "when")) { |
- xsltWhenComp(style, node); |
- } else if (IS_XSLT_NAME(node, "otherwise")) { |
- /* NOP yet */ |
- return; |
- } else if (IS_XSLT_NAME(node, "for-each")) { |
- xsltForEachComp(style, node); |
- } else if (IS_XSLT_NAME(node, "apply-imports")) { |
- xsltApplyImportsComp(style, node); |
- } else if (IS_XSLT_NAME(node, "attribute")) { |
- xsltAttributeComp(style, node); |
- } else if (IS_XSLT_NAME(node, "element")) { |
- xsltElementComp(style, node); |
- } else if (IS_XSLT_NAME(node, "sort")) { |
- xsltSortComp(style, node); |
- } else if (IS_XSLT_NAME(node, "comment")) { |
- xsltCommentComp(style, node); |
- } else if (IS_XSLT_NAME(node, "number")) { |
- xsltNumberComp(style, node); |
- } else if (IS_XSLT_NAME(node, "processing-instruction")) { |
- xsltProcessingInstructionComp(style, node); |
- } else if (IS_XSLT_NAME(node, "call-template")) { |
- xsltCallTemplateComp(style, node); |
- } else if (IS_XSLT_NAME(node, "param")) { |
- xsltParamComp(style, node); |
- } else if (IS_XSLT_NAME(node, "variable")) { |
- xsltVariableComp(style, node); |
- } else if (IS_XSLT_NAME(node, "fallback")) { |
- /* NOP yet */ |
- return; |
- } else if (IS_XSLT_NAME(node, "document")) { |
- /* The extra one */ |
- node->psvi = (void *) xsltDocumentComp(style, node, |
- (xsltTransformFunction) xsltDocumentElem); |
- } else if (IS_XSLT_NAME(node, "output")) { |
- /* Top-level */ |
- return; |
- } else if (IS_XSLT_NAME(node, "preserve-space")) { |
- /* Top-level */ |
- return; |
- } else if (IS_XSLT_NAME(node, "strip-space")) { |
- /* Top-level */ |
- return; |
- } else if (IS_XSLT_NAME(node, "key")) { |
- /* Top-level */ |
- return; |
- } else if (IS_XSLT_NAME(node, "message")) { |
- return; |
- } else if (IS_XSLT_NAME(node, "attribute-set")) { |
- /* Top-level */ |
- return; |
- } else if (IS_XSLT_NAME(node, "namespace-alias")) { |
- /* Top-level */ |
- return; |
- } else if (IS_XSLT_NAME(node, "decimal-format")) { |
- /* Top-level */ |
- return; |
- } else if (IS_XSLT_NAME(node, "include")) { |
- /* Top-level */ |
- } else { |
- /* |
- * NOTE that xsl:text, xsl:template, xsl:stylesheet, |
- * xsl:transform, xsl:import, xsl:include are not expected |
- * to be handed over to this function. |
- */ |
- xsltTransformError(NULL, style, node, |
- "Internal error: (xsltStylePreCompute) cannot handle " |
- "the XSLT element '%s'.\n", node->name); |
- style->errors++; |
- return; |
- } |
- } |
- /* |
- * Assign the current list of in-scope namespaces to the |
- * item. This is needed for XPath expressions. |
- */ |
- if (node->psvi != NULL) { |
- ((xsltStylePreCompPtr) node->psvi)->inScopeNs = |
- XSLT_CCTXT(style)->inode->inScopeNs; |
- } |
-} |
- |
-#else |
- |
-/** |
- * xsltStylePreCompute: |
- * @style: the XSLT stylesheet |
- * @inst: the instruction in the stylesheet |
- * |
- * Precompute an XSLT stylesheet element |
- */ |
-void |
-xsltStylePreCompute(xsltStylesheetPtr style, xmlNodePtr inst) { |
- /* |
- * URGENT TODO: Normally inst->psvi Should never be reserved here, |
- * BUT: since if we include the same stylesheet from |
- * multiple imports, then the stylesheet will be parsed |
- * again. We simply must not try to compute the stylesheet again. |
- * TODO: Get to the point where we don't need to query the |
- * namespace- and local-name of the node, but can evaluate this |
- * using cctxt->style->inode->category; |
- */ |
- if ((inst == NULL) || (inst->type != XML_ELEMENT_NODE) || |
- (inst->psvi != NULL)) |
- return; |
- |
- if (IS_XSLT_ELEM(inst)) { |
- xsltStylePreCompPtr cur; |
- |
- if (IS_XSLT_NAME(inst, "apply-templates")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltApplyTemplatesComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "with-param")) { |
- xsltCheckParentElement(style, inst, BAD_CAST "apply-templates", |
- BAD_CAST "call-template"); |
- xsltWithParamComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "value-of")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltValueOfComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "copy")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltCopyComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "copy-of")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltCopyOfComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "if")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltIfComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "when")) { |
- xsltCheckParentElement(style, inst, BAD_CAST "choose", NULL); |
- xsltWhenComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "choose")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltChooseComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "for-each")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltForEachComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "apply-imports")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltApplyImportsComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "attribute")) { |
- xmlNodePtr parent = inst->parent; |
- |
- if ((parent == NULL) || |
- (parent->type != XML_ELEMENT_NODE) || (parent->ns == NULL) || |
- ((parent->ns != inst->ns) && |
- (!xmlStrEqual(parent->ns->href, inst->ns->href))) || |
- (!xmlStrEqual(parent->name, BAD_CAST "attribute-set"))) { |
- xsltCheckInstructionElement(style, inst); |
- } |
- xsltAttributeComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "element")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltElementComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "text")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltTextComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "sort")) { |
- xsltCheckParentElement(style, inst, BAD_CAST "apply-templates", |
- BAD_CAST "for-each"); |
- xsltSortComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "comment")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltCommentComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "number")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltNumberComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "processing-instruction")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltProcessingInstructionComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "call-template")) { |
- xsltCheckInstructionElement(style, inst); |
- xsltCallTemplateComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "param")) { |
- if (xsltCheckTopLevelElement(style, inst, 0) == 0) |
- xsltCheckInstructionElement(style, inst); |
- xsltParamComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "variable")) { |
- if (xsltCheckTopLevelElement(style, inst, 0) == 0) |
- xsltCheckInstructionElement(style, inst); |
- xsltVariableComp(style, inst); |
- } else if (IS_XSLT_NAME(inst, "otherwise")) { |
- xsltCheckParentElement(style, inst, BAD_CAST "choose", NULL); |
- xsltCheckInstructionElement(style, inst); |
- return; |
- } else if (IS_XSLT_NAME(inst, "template")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "output")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "preserve-space")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "strip-space")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if ((IS_XSLT_NAME(inst, "stylesheet")) || |
- (IS_XSLT_NAME(inst, "transform"))) { |
- xmlNodePtr parent = inst->parent; |
- |
- if ((parent == NULL) || (parent->type != XML_DOCUMENT_NODE)) { |
- xsltTransformError(NULL, style, inst, |
- "element %s only allowed only as root element\n", |
- inst->name); |
- style->errors++; |
- } |
- return; |
- } else if (IS_XSLT_NAME(inst, "key")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "message")) { |
- xsltCheckInstructionElement(style, inst); |
- return; |
- } else if (IS_XSLT_NAME(inst, "attribute-set")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "namespace-alias")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "include")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "import")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "decimal-format")) { |
- xsltCheckTopLevelElement(style, inst, 1); |
- return; |
- } else if (IS_XSLT_NAME(inst, "fallback")) { |
- xsltCheckInstructionElement(style, inst); |
- return; |
- } else if (IS_XSLT_NAME(inst, "document")) { |
- xsltCheckInstructionElement(style, inst); |
- inst->psvi = (void *) xsltDocumentComp(style, inst, |
- (xsltTransformFunction) xsltDocumentElem); |
- } else if ((style == NULL) || (style->forwards_compatible == 0)) { |
- xsltTransformError(NULL, style, inst, |
- "xsltStylePreCompute: unknown xsl:%s\n", inst->name); |
- if (style != NULL) style->warnings++; |
- } |
- |
- cur = (xsltStylePreCompPtr) inst->psvi; |
- /* |
- * A ns-list is build for every XSLT item in the |
- * node-tree. This is needed for XPath expressions. |
- */ |
- if (cur != NULL) { |
- int i = 0; |
- |
- cur->nsList = xmlGetNsList(inst->doc, inst); |
- if (cur->nsList != NULL) { |
- while (cur->nsList[i] != NULL) |
- i++; |
- } |
- cur->nsNr = i; |
- } |
- } else { |
- inst->psvi = |
- (void *) xsltPreComputeExtModuleElement(style, inst); |
- |
- /* |
- * Unknown element, maybe registered at the context |
- * level. Mark it for later recognition. |
- */ |
- if (inst->psvi == NULL) |
- inst->psvi = (void *) xsltExtMarker; |
- } |
-} |
-#endif /* XSLT_REFACTORED */ |