/** * exsltMathLowest: * @ns: a node-set * * Implements the EXSLT - Math lowest() function * node-set math:lowest (node-set) * * Returns the nodes in the node-set whose value is the minimum value * for the node-set. */ static xmlNodeSetPtr exsltMathLowest (xmlNodeSetPtr ns) { xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL); double min, cur; int i; if ((ns == NULL) || (ns->nodeNr == 0)) return(ret); min = xmlXPathCastNodeToNumber(ns->nodeTab[0]); if (xmlXPathIsNaN(min)) return(ret); else xmlXPathNodeSetAddUnique(ret, ns->nodeTab[0]); for (i = 1; i < ns->nodeNr; i++) { cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]); if (xmlXPathIsNaN(cur)) { xmlXPathEmptyNodeSet(ret); return(ret); } if (cur > min) continue; if (cur < min) { min = cur; xmlXPathEmptyNodeSet(ret); xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]); continue; } xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]); } return(ret); }
/** * 'insert' operation */ static void edInsert(xmlDocPtr doc, xmlNodeSetPtr nodes, const char *val, const char *name, XmlNodeType type, int mode) { int i; xmlXPathEmptyNodeSet(previous_insertion); for (i = 0; i < nodes->nodeNr; i++) { xmlNodePtr node; if (nodes->nodeTab[i] == (void*) doc && mode != 0) { fprintf(stderr, "The document node cannot have siblings.\n"); exit(EXIT_INTERNAL_ERROR); } /* update node */ if (type == XML_ATTR) { node = (xmlNodePtr) xmlNewProp(nodes->nodeTab[i], BAD_CAST name, BAD_CAST val); } else if (type == XML_ELEM) { node = xmlNewDocNode(doc, NULL /* TODO: NS */, BAD_CAST name, BAD_CAST val); if (mode > 0) xmlAddNextSibling(nodes->nodeTab[i], node); else if (mode < 0) xmlAddPrevSibling(nodes->nodeTab[i], node); else xmlAddChild(nodes->nodeTab[i], node); } else if (type == XML_TEXT) { node = xmlNewDocText(doc, BAD_CAST val); if (mode > 0) xmlAddNextSibling(nodes->nodeTab[i], node); else if (mode < 0) xmlAddPrevSibling(nodes->nodeTab[i], node); else xmlAddChild(nodes->nodeTab[i], node); } xmlXPathNodeSetAdd(previous_insertion, node); } }