}
// fast path for the simple case
if (vec == null && format == null && gpsize == 0 && lang == null) {
return new StringValue("" + value);
}
// Use the numberer decided at compile time if possible; otherwise try to get it from
// a table of numberers indexed by language; if not there, load the relevant class and
// add it to the table.
Numberer numb = numberer;
if (numb == null) {
String language = lang.evaluateAsString(context).toString();
if (!StringValue.isValidLanguageCode(language)) {
throw new XPathException("The lang attribute of xsl:number must be a valid language code", "XTDE0030");
}
numb = context.getConfiguration().makeNumberer(language, null);
}
if (letterValue == null) {
letterVal = "";
} else {
letterVal = letterValue.evaluateAsString(context).toString();
if (!("alphabetic".equals(letterVal) || "traditional".equals(letterVal))) {
XPathException e = new XPathException("letter-value must be \"traditional\" or \"alphabetic\"");
e.setXPathContext(context);
e.setErrorCode("XTDE0030");
throw e;
}
}
if (vec == null) {
vec = new ArrayList(1);
vec.add(Long.valueOf(value));
}
NumberFormatter nf;
if (formatter == null) { // format not known until run-time
nf = new NumberFormatter();
nf.prepare(format.evaluateAsString(context).toString());
} else {
nf = formatter;
}
CharSequence s = nf.format(vec, gpsize, gpseparator, letterVal, ordinalVal, numb);
return new StringValue(s);
}