예제 #1
0
static void
addIntegerPropToNode (xmlNodePtr node,
		      const char *name,
		      int        value)
{
    xmlChar *string = xmlXPathCastNumberToString (value);

    if (!string)
	return;

    xmlNewProp (node, BAD_CAST name, string);
    xmlFree (string);
}
예제 #2
0
파일: srd.c 프로젝트: abnicken/sysrepod
int
printXPathAtomic (xmlXPathObjectPtr objset, char **printBuffPtr, int printBuffSize)
{
	int retValue;
	char *res = NULL;
	int size = printBuffSize;
	char *newSpace;
	int n;

	if (objset == NULL) return -1;
	switch (objset->type){
	case XPATH_STRING:
        res = strdup ((char *)objset->stringval);
        break;
    case XPATH_BOOLEAN:
        res = (char *)xmlXPathCastBooleanToString(objset->boolval);
        break;
    case XPATH_NUMBER:
        res = (char *) xmlXPathCastNumberToString(objset->floatval);
        break;
	}
	if (res == NULL || strlen (res) == 0){
		if (res) free (res);
		return 0;
	}
	if (size < (strlen(res) + 1)){
	    size = strlen(res) + 1;
	    newSpace = (char *)realloc (*printBuffPtr, size);
	    if (newSpace){
	        *printBuffPtr = newSpace;
	    } else {
	        // unable to allocate space
	        if (res) free (res);
	        return -1;
	    }
	}
	n = sprintf (*printBuffPtr, "%s", res);
	if (res) free (res);
	return n;
}
예제 #3
0
파일: xml.cpp 프로젝트: zhenyouluo/GPL
bool gpl::xml::getXPathResultSet(std::multimap<std::string, std::string>& resultSet)
{
	resultSet.clear();
	//added by shandy 20041208
	if (m_xml->resource == NULL)
		return true;

	std::vector<std::string> strVector;
	std::string str, name;
	int i;
	xmlNodeSetPtr tmpPtr = 0;

	//cout<<"resource->type:"<<m_xml->resource->type<<endl;
	switch (m_xml->resource->type)
	{
	case XPATH_UNDEFINED://Object is uninitialized
		return false;
		break;
	case XPATH_NODESET://Object is a Node Set
		tmpPtr = m_xml->resource->nodesetval;
		if (tmpPtr == NULL)
			break;
		for (i = 0; i < tmpPtr->nodeNr; i++)
			m_xml->getDumpNode(tmpPtr->nodeTab[i], resultSet);
		break;
	case XPATH_XSLT_TREE://Object is an XSLT value tree
		return false;
		break;
	case XPATH_BOOLEAN://Object is a Boolean
		str = m_xml->getStringByXmlCharPtr(xmlXPathCastBooleanToString(m_xml->resource->boolval), 1);
		resultSet.insert(std::multimap<std::string, std::string>::value_type(std::string("boolean"), str));
		break;
	case XPATH_NUMBER://Object is a number
		str = m_xml->getStringByXmlCharPtr(xmlXPathCastNumberToString(m_xml->resource->floatval), 1);
		resultSet.insert(std::multimap<std::string, std::string>::value_type(std::string("number"), str));
		break;
	case XPATH_STRING://Object is a string
		if (m_xml->resource->stringval != NULL)
		{
			std::string str = m_xml->getStringByXmlCharPtr(m_xml->resource->stringval);
			resultSet.insert(std::multimap<std::string, std::string>::value_type(std::string("string"), str));
		}
		break;
	case XPATH_POINT://Object is a point
		//fprintf(output, " : index %d in node", m_xml->resource->index);
		m_xml->getDumpNode((xmlNodePtr)m_xml->resource->user, resultSet);
		break;
	case XPATH_RANGE:
		if ((m_xml->resource->user2 == NULL) ||
			((m_xml->resource->user2 == m_xml->resource->user) && (m_xml->resource->index == m_xml->resource->index2)))
		{
			//Object is a collapsed range 
			//if (m_xml->resource->index >= 0)
			//    fprintf(output, "index %d in ", m_xml->resource->index);
			//fprintf(output, "node\n");
			m_xml->getDumpNode((xmlNodePtr)m_xml->resource->user, resultSet);
		}
		else
		{
			//Object is a range from 
			//if (m_xml->resource->index >= 0)
			//    fprintf(output, "index %d in ", m_xml->resource->index);
			m_xml->getDumpNode((xmlNodePtr)m_xml->resource->user, resultSet);
			// to 
			//if (m_xml->resource->index2 >= 0)
			//    fprintf(output, "index %d in ", m_xml->resource->index2);
			m_xml->getDumpNode((xmlNodePtr)m_xml->resource->user2, resultSet);
		}
		break;
	case XPATH_LOCATIONSET://Object is a Location Set
		return false;
		break;
	case XPATH_USERS://Object is user defined
		return false;
		break;
	}
	return true;
}
예제 #4
0
static void
exsltDynMapFunction(xmlXPathParserContextPtr ctxt, int nargs)
{
    xmlChar *str = NULL;
    xmlNodeSetPtr nodeset = NULL;
    xsltTransformContextPtr tctxt;
    xmlXPathCompExprPtr comp = NULL;
    xmlXPathObjectPtr ret = NULL;
    xmlDocPtr oldDoc, container = NULL;
    xmlNodePtr oldNode;
    int oldContextSize;
    int oldProximityPosition;
    int i, j;


    if (nargs != 2) {
        xmlXPathSetArityError(ctxt);
        return;
    }
    str = xmlXPathPopString(ctxt);
    if (xmlXPathCheckError(ctxt)) {
        xmlXPathSetTypeError(ctxt);
        return;
    }

    nodeset = xmlXPathPopNodeSet(ctxt);
    if (xmlXPathCheckError(ctxt)) {
        xmlXPathSetTypeError(ctxt);
        return;
    }
    if (str == NULL || !xmlStrlen(str) || !(comp = xmlXPathCompile(str))) {
        if (nodeset != NULL)
            xmlXPathFreeNodeSet(nodeset);
        if (str != NULL)
            xmlFree(str);
        valuePush(ctxt, xmlXPathNewNodeSet(NULL));
        return;
    }

    ret = xmlXPathNewNodeSet(NULL);
    if (ret == NULL) {
        xsltGenericError(xsltGenericErrorContext,
                         "exsltDynMapFunction: ret == NULL\n");
        goto cleanup;
    }

    oldDoc = ctxt->context->doc;
    oldNode = ctxt->context->node;
    oldContextSize = ctxt->context->contextSize;
    oldProximityPosition = ctxt->context->proximityPosition;

    tctxt = xsltXPathGetTransformContext(ctxt);
    if (tctxt == NULL) {
	xsltTransformError(xsltXPathGetTransformContext(ctxt), NULL, NULL,
	      "dyn:map : internal error tctxt == NULL\n");
	goto cleanup;
    }
    container = xsltCreateRVT(tctxt);
    if (container == NULL) {
	xsltTransformError(tctxt, NULL, NULL,
	      "dyn:map : internal error container == NULL\n");
	goto cleanup;
    }
    xsltRegisterLocalRVT(tctxt, container);
    if (nodeset && nodeset->nodeNr > 0) {
        xmlXPathNodeSetSort(nodeset);
        ctxt->context->contextSize = nodeset->nodeNr;
        ctxt->context->proximityPosition = 0;
        for (i = 0; i < nodeset->nodeNr; i++) {
            xmlXPathObjectPtr subResult = NULL;

            ctxt->context->proximityPosition++;
            ctxt->context->node = nodeset->nodeTab[i];
            ctxt->context->doc = nodeset->nodeTab[i]->doc;

            subResult = xmlXPathCompiledEval(comp, ctxt->context);
            if (subResult != NULL) {
                switch (subResult->type) {
                    case XPATH_NODESET:
                        if (subResult->nodesetval != NULL)
                            for (j = 0; j < subResult->nodesetval->nodeNr;
                                 j++)
                                xmlXPathNodeSetAdd(ret->nodesetval,
                                                   subResult->nodesetval->
                                                   nodeTab[j]);
                        break;
                    case XPATH_BOOLEAN:
                        if (container != NULL) {
                            xmlNodePtr cur =
                                xmlNewChild((xmlNodePtr) container, NULL,
                                            BAD_CAST "boolean",
                                            BAD_CAST (subResult->
                                            boolval ? "true" : ""));
                            if (cur != NULL) {
                                cur->ns =
                                    xmlNewNs(cur,
                                             BAD_CAST
                                             "http://exslt.org/common",
                                             BAD_CAST "exsl");
                                xmlXPathNodeSetAddUnique(ret->nodesetval,
                                                         cur);
                            }
			    xsltExtensionInstructionResultRegister(tctxt, ret);
                        }
                        break;
                    case XPATH_NUMBER:
                        if (container != NULL) {
                            xmlChar *val =
                                xmlXPathCastNumberToString(subResult->
                                                           floatval);
                            xmlNodePtr cur =
                                xmlNewChild((xmlNodePtr) container, NULL,
                                            BAD_CAST "number", val);
                            if (val != NULL)
                                xmlFree(val);

                            if (cur != NULL) {
                                cur->ns =
                                    xmlNewNs(cur,
                                             BAD_CAST
                                             "http://exslt.org/common",
                                             BAD_CAST "exsl");
                                xmlXPathNodeSetAddUnique(ret->nodesetval,
                                                         cur);
                            }
			    xsltExtensionInstructionResultRegister(tctxt, ret);
                        }
                        break;
                    case XPATH_STRING:
                        if (container != NULL) {
                            xmlNodePtr cur =
                                xmlNewChild((xmlNodePtr) container, NULL,
                                            BAD_CAST "string",
                                            subResult->stringval);
                            if (cur != NULL) {
                                cur->ns =
                                    xmlNewNs(cur,
                                             BAD_CAST
                                             "http://exslt.org/common",
                                             BAD_CAST "exsl");
                                xmlXPathNodeSetAddUnique(ret->nodesetval,
                                                         cur);
                            }
			    xsltExtensionInstructionResultRegister(tctxt, ret);
                        }
                        break;
		    default:
                        break;
                }
                xmlXPathFreeObject(subResult);
            }
        }
    }
    ctxt->context->doc = oldDoc;
    ctxt->context->node = oldNode;
    ctxt->context->contextSize = oldContextSize;
    ctxt->context->proximityPosition = oldProximityPosition;


  cleanup:
    
    if (comp != NULL)
        xmlXPathFreeCompExpr(comp);
    if (nodeset != NULL)
        xmlXPathFreeNodeSet(nodeset);
    if (str != NULL)
        xmlFree(str);
    valuePush(ctxt, ret);
    return;
}