// boolean functions void xforms_booleanFromStringFunction(xmlXPathParserContextPtr ctxt, int nargs)
{ if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY);
xmlChar *pString = xmlXPathPopString(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE);
OUString aString(reinterpret_cast<char*>(pString), strlen(reinterpret_cast<char*>(pString)), RTL_TEXTENCODING_UTF8); if (aString.equalsIgnoreAsciiCase("true") ||
aString.equalsIgnoreAsciiCase("1"))
xmlXPathReturnTrue(ctxt); elseif (aString.equalsIgnoreAsciiCase("false") ||
aString.equalsIgnoreAsciiCase("0"))
xmlXPathReturnFalse(ctxt); else
XP_ERROR(XPATH_NUMBER_ERROR);
}
void xforms_ifFunction(xmlXPathParserContextPtr ctxt, int nargs)
{ if (nargs != 3) XP_ERROR(XPATH_INVALID_ARITY);
xmlChar *s2 = xmlXPathPopString(ctxt);
if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE);
xmlChar *s1 = xmlXPathPopString(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); bool aBool = xmlXPathPopBoolean(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE);
if (aBool)
xmlXPathReturnString(ctxt, s1); else
xmlXPathReturnString(ctxt, s2);
}
// Number Functions void xforms_avgFunction(xmlXPathParserContextPtr ctxt, int nargs)
{ // use sum(), div() and count() if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY);
// save nodeset
xmlXPathObjectPtr pObject = valuePop(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); //push back a copy
valuePush(ctxt, xmlXPathObjectCopy(pObject)); // get the Sum
xmlXPathSumFunction(ctxt, 1); double nSum = xmlXPathPopNumber(ctxt); // push a copy once more
valuePush(ctxt, xmlXPathObjectCopy(pObject));
xmlXPathCountFunction(ctxt, 1); double nCount = xmlXPathPopNumber(ctxt); // push args for div()
xmlXPathReturnNumber(ctxt, nSum);
xmlXPathReturnNumber(ctxt, nCount);
xmlXPathDivValues(ctxt); // the result is now on the ctxt stack
xmlXPathFreeObject(pObject);
}
void xforms_minFunction(xmlXPathParserContextPtr ctxt, int nargs)
{ if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY);
xmlNodeSetPtr pNodeSet = xmlXPathPopNodeSet(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); double nMinimum = 0; for (int i = 0; i < xmlXPathNodeSetGetLength(pNodeSet); i++)
{ double nNumber = xmlXPathCastNodeToNumber(xmlXPathNodeSetItem(pNodeSet, i)); if (xmlXPathIsNaN(nNumber))
{
xmlXPathReturnNumber(ctxt, xmlXPathNAN); return;
} if (i == 0)
nMinimum = nNumber; elseif (nNumber < nMinimum)
nMinimum = nNumber;
}
xmlXPathReturnNumber(ctxt, nMinimum);
}
void xforms_maxFunction(xmlXPathParserContextPtr ctxt, int nargs)
{ if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY);
xmlNodeSetPtr pNodeSet = xmlXPathPopNodeSet(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE); double nMaximum = 0; for (int i = 0; i < xmlXPathNodeSetGetLength(pNodeSet); i++)
{ double nNumber = xmlXPathCastNodeToNumber(xmlXPathNodeSetItem(pNodeSet, i)); if (xmlXPathIsNaN(nNumber))
{
xmlXPathReturnNumber(ctxt, xmlXPathNAN); return;
} if (i == 0)
nMaximum = nNumber; elseif (nNumber > nMaximum)
nMaximum = nNumber;
}
xmlXPathReturnNumber(ctxt, nMaximum);
} void xforms_countNonEmptyFunction(xmlXPathParserContextPtr ctxt, int nargs)
{ if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY);
xmlNodeSetPtr pNodeSet = xmlXPathPopNodeSet(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE);
sal_Int32 nNotEmpty = 0; for (int i = 0; i < xmlXPathNodeSetGetLength(pNodeSet); i++)
{ const xmlChar *aString = xmlXPathCastNodeToString(xmlXPathNodeSetItem(pNodeSet, i)); if (*aString != 0) nNotEmpty++;
}
xmlXPathReturnNumber(ctxt, nNotEmpty);
} void xforms_indexFunction(xmlXPathParserContextPtr /*ctxt*/, int /*nargs*/)
{ // function index takes a string argument that is the IDREF of a // 'repeat' and returns the current 1-based position of the repeat // index of the identified repeat -- see xforms/9.3.1
// doc.getElementByID // (...)
}
// String Functions void xforms_propertyFunction(xmlXPathParserContextPtr ctxt, int nargs)
{ if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY);
xmlChar* pString = xmlXPathPopString(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE);
OUString aString(reinterpret_cast<char*>(pString), strlen(reinterpret_cast<char*>(pString)), RTL_TEXTENCODING_UTF8); if (aString.equalsIgnoreAsciiCase("version"))
xmlXPathReturnString(ctxt, reinterpret_cast<xmlChar *>(const_cast<char *>("1.0"))); elseif (aString.equalsIgnoreAsciiCase("conformance-level"))
xmlXPathReturnString(ctxt, reinterpret_cast<xmlChar *>(const_cast<char *>("conformance"))); else
xmlXPathReturnEmptyString(ctxt);
}
// Date and Time Functions
static OString makeDateTimeString (const DateTime& aDateTime)
{
OStringBuffer aDateTimeString;
aDateTimeString.append(static_cast<sal_Int32>(aDateTime.GetYear()));
aDateTimeString.append('-'); if (aDateTime.GetMonth()<10) aDateTimeString.append('0');
aDateTimeString.append(static_cast<sal_Int32>(aDateTime.GetMonth()));
aDateTimeString.append('-'); if (aDateTime.GetDay()<10) aDateTimeString.append('0');
aDateTimeString.append(static_cast<sal_Int32>(aDateTime.GetDay()));
aDateTimeString.append('T'); if (aDateTime.GetHour()<10) aDateTimeString.append('0');
aDateTimeString.append(static_cast<sal_Int32>(aDateTime.GetHour()));
aDateTimeString.append(':'); if (aDateTime.GetMin()<10) aDateTimeString.append('0');
aDateTimeString.append(static_cast<sal_Int32>(aDateTime.GetMin()));
aDateTimeString.append(':'); if (aDateTime.GetSec()<10) aDateTimeString.append('0');
aDateTimeString.append(static_cast<sal_Int32>(aDateTime.GetSec()));
aDateTimeString.append('Z');
return aDateTimeString.makeStringAndClear();
}
// returns current system date and time in canonical xsd:dateTime // format void xforms_nowFunction(xmlXPathParserContextPtr ctxt, int/*nargs*/)
{ /* Asinglelexicalrepresentation,whichisasubsetofthelexicalrepresentations allowedby[ISO8601],isallowedfordateTime.Thislexicalrepresentationisthe [ISO8601]extendedformatCCYY-MM-DDThh:mm:sswhere"CC"representsthecentury, "YY"theyear,"MM"themonthand"DD"theday,precededbyanoptionalleading"-" signtoindicateanegativenumber.Ifthesignisomitted,"+"isassumed.Theletter "T"isthedate/timeseparatorand"hh","mm","ss"representhour,minuteandsecond respectively.
*/
void xforms_secondsFromDateTimeFunction(xmlXPathParserContextPtr ctxt, int nargs)
{ // number of seconds from 1970-01-01T00:00:00Z to supplied xsd:date(Time)
if (nargs != 1) XP_ERROR(XPATH_INVALID_ARITY);
xmlChar* pString = xmlXPathPopString(ctxt); if (xmlXPathCheckError(ctxt)) XP_ERROR(XPATH_INVALID_TYPE);
OUString aString(reinterpret_cast<char*>(pString), strlen(reinterpret_cast<char*>(pString)), RTL_TEXTENCODING_UTF8);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.