static int create_xslt_parser( struct xslt_info *info, xmlNodePtr node, const xmlChar *str ) { if(!node) return 1; info->sheet = xsltNewStylesheet(); if (!info->sheet) return 0; info->ctxt = xsltNewTransformContext( info->sheet, node->doc ); if (!info->ctxt) return 0; info->pattern = xsltCompilePattern( str, node->doc, node, info->sheet, info->ctxt ); if (!info->pattern) return 0; return 1; }
static int xsltNumberFormatGetMultipleLevel(xsltTransformContextPtr context, xmlNodePtr node, xmlChar *count, xmlChar *from, double *array, int max, xmlDocPtr doc, xmlNodePtr elem) { int amount = 0; int cnt; xmlNodePtr ancestor; xmlNodePtr preceding; xmlXPathParserContextPtr parser; xsltCompMatchPtr countPat; xsltCompMatchPtr fromPat; if (count != NULL) countPat = xsltCompilePattern(count, doc, elem, NULL, context); else countPat = NULL; if (from != NULL) fromPat = xsltCompilePattern(from, doc, elem, NULL, context); else fromPat = NULL; context->xpathCtxt->node = node; parser = xmlXPathNewParserContext(NULL, context->xpathCtxt); if (parser) { /* ancestor-or-self::*[count] */ for (ancestor = node; (ancestor != NULL) && (ancestor->type != XML_DOCUMENT_NODE); ancestor = xmlXPathNextAncestor(parser, ancestor)) { if ((from != NULL) && xsltTestCompMatchList(context, ancestor, fromPat)) break; /* for */ if ((count == NULL) || xsltTestCompMatchList(context, ancestor, countPat)) { /* count(preceding-sibling::*) */ cnt = 0; for (preceding = ancestor; preceding != NULL; preceding = xmlXPathNextPrecedingSibling(parser, preceding)) { if (count == NULL) { if ((preceding->type == ancestor->type) && /* FIXME */ xmlStrEqual(preceding->name, ancestor->name)) cnt++; } else { if (xsltTestCompMatchList(context, preceding, countPat)) cnt++; } } array[amount++] = (double)cnt; if (amount >= max) break; /* for */ } } xmlXPathFreeParserContext(parser); } xsltFreeCompMatchList(countPat); xsltFreeCompMatchList(fromPat); return amount; }
static int xsltNumberFormatGetAnyLevel(xsltTransformContextPtr context, xmlNodePtr node, xmlChar *count, xmlChar *from, double *array, xmlDocPtr doc, xmlNodePtr elem) { int amount = 0; int cnt = 0; xmlNodePtr cur; xsltCompMatchPtr countPat = NULL; xsltCompMatchPtr fromPat = NULL; if (count != NULL) countPat = xsltCompilePattern(count, doc, elem, NULL, context); if (from != NULL) fromPat = xsltCompilePattern(from, doc, elem, NULL, context); /* select the starting node */ switch (node->type) { case XML_ELEMENT_NODE: cur = node; break; case XML_ATTRIBUTE_NODE: cur = ((xmlAttrPtr) node)->parent; break; case XML_TEXT_NODE: case XML_PI_NODE: case XML_COMMENT_NODE: cur = node->parent; break; default: cur = NULL; break; } while (cur != NULL) { /* process current node */ if (count == NULL) { if ((node->type == cur->type) && /* FIXME: must use expanded-name instead of local name */ xmlStrEqual(node->name, cur->name)) cnt++; } else { if (xsltTestCompMatchList(context, cur, countPat)) cnt++; } if ((from != NULL) && xsltTestCompMatchList(context, cur, fromPat)) { break; /* while */ } /* Skip to next preceding or ancestor */ if ((cur->type == XML_DOCUMENT_NODE) || #ifdef LIBXML_DOCB_ENABLED (cur->type == XML_DOCB_DOCUMENT_NODE) || #endif (cur->type == XML_HTML_DOCUMENT_NODE)) break; /* while */ while ((cur->prev != NULL) && (cur->prev->type == XML_DTD_NODE)) cur = cur->prev; if (cur->prev != NULL) { for (cur = cur->prev; cur->last != NULL; cur = cur->last); } else { cur = cur->parent; } } array[amount++] = (double) cnt; if (countPat != NULL) xsltFreeCompMatchList(countPat); if (fromPat != NULL) xsltFreeCompMatchList(fromPat); return(amount); }