Datum xpath_number(PG_FUNCTION_ARGS) { xmlChar *xpath; int32 pathsize; text *xpathsupp; float4 fRes; xmlXPathObjectPtr res; /* PG_GETARG_TEXT_P(0) is document buffer */ xpathsupp = PG_GETARG_TEXT_P(1); /* XPath expression */ pathsize = VARSIZE(xpathsupp) - VARHDRSZ; xpath = pgxml_texttoxmlchar(xpathsupp); res = pgxml_xpath(PG_GETARG_TEXT_P(0), xpath); pfree(xpath); if (res == NULL) PG_RETURN_NULL(); fRes = xmlXPathCastToNumber(res); if (xmlXPathIsNaN(fRes)) PG_RETURN_NULL(); PG_RETURN_FLOAT4(fRes); }
Datum xpath_number(PG_FUNCTION_ARGS) { text *document = PG_GETARG_TEXT_P(0); text *xpathsupp = PG_GETARG_TEXT_P(1); /* XPath expression */ xmlChar *xpath; float4 fRes; xmlXPathObjectPtr res; xpath_workspace workspace; xpath = pgxml_texttoxmlchar(xpathsupp); res = pgxml_xpath(document, xpath, &workspace); pfree(xpath); if (res == NULL) PG_RETURN_NULL(); fRes = xmlXPathCastToNumber(res); cleanup_workspace(&workspace); if (xmlXPathIsNaN(fRes)) PG_RETURN_NULL(); PG_RETURN_FLOAT4(fRes); }
// --------------------------------------------------------------------------- // Retrieves numeric value of the result. // Conversion occurs as XPath spec says if the result is not of ENumber type // --------------------------------------------------------------------------- // EXPORT_C TReal RXmlEngXPathResult::AsNumber() const { if (RESULT_OBJ->type == XPATH_NUMBER) return RESULT_OBJ->floatval; else return xmlXPathCastToNumber(RESULT_OBJ); }