corefunction.java
来自「JXPath」· Java 代码 · 共 688 行 · 第 1/2 页
JAVA
688 行
assertArgCount(2);
String key = InfoSetUtil.stringValue(getArg1().computeValue(context));
String value = InfoSetUtil.stringValue(getArg2().computeValue(context));
JXPathContext jxpathContext = context.getJXPathContext();
NodePointer pointer = (NodePointer) jxpathContext.getContextPointer();
return pointer.getPointerByKey(jxpathContext, key, value);
}
protected Object functionNamespaceURI(EvalContext context) {
if (getArgumentCount() == 0) {
NodePointer ptr = context.getCurrentNodePointer();
String str = ptr.getNamespaceURI();
return str == null ? "" : str;
}
assertArgCount(1);
Object set = getArg1().compute(context);
if (set instanceof EvalContext) {
EvalContext ctx = (EvalContext) set;
if (ctx.hasNext()) {
NodePointer ptr = (NodePointer) ctx.next();
String str = ptr.getNamespaceURI();
return str == null ? "" : str;
}
}
return "";
}
protected Object functionLocalName(EvalContext context) {
if (getArgumentCount() == 0) {
NodePointer ptr = context.getCurrentNodePointer();
return ptr.getName().getName();
}
assertArgCount(1);
Object set = getArg1().compute(context);
if (set instanceof EvalContext) {
EvalContext ctx = (EvalContext) set;
if (ctx.hasNext()) {
NodePointer ptr = (NodePointer) ctx.next();
return ptr.getName().getName();
}
}
return "";
}
protected Object functionName(EvalContext context) {
if (getArgumentCount() == 0) {
NodePointer ptr = context.getCurrentNodePointer();
return ptr.getName().toString();
}
assertArgCount(1);
Object set = getArg1().compute(context);
if (set instanceof EvalContext) {
EvalContext ctx = (EvalContext) set;
if (ctx.hasNext()) {
NodePointer ptr = (NodePointer) ctx.next();
return ptr.getName().toString();
}
}
return "";
}
protected Object functionString(EvalContext context) {
if (getArgumentCount() == 0) {
return InfoSetUtil.stringValue(context.getCurrentNodePointer());
}
assertArgCount(1);
return InfoSetUtil.stringValue(getArg1().computeValue(context));
}
protected Object functionConcat(EvalContext context) {
if (getArgumentCount() < 2) {
assertArgCount(2);
}
StringBuffer buffer = new StringBuffer();
Expression args[] = getArguments();
for (int i = 0; i < args.length; i++) {
buffer.append(InfoSetUtil.stringValue(args[i].compute(context)));
}
return buffer.toString();
}
protected Object functionStartsWith(EvalContext context) {
assertArgCount(2);
String s1 = InfoSetUtil.stringValue(getArg1().computeValue(context));
String s2 = InfoSetUtil.stringValue(getArg2().computeValue(context));
return s1.startsWith(s2) ? Boolean.TRUE : Boolean.FALSE;
}
protected Object functionContains(EvalContext context) {
assertArgCount(2);
String s1 = InfoSetUtil.stringValue(getArg1().computeValue(context));
String s2 = InfoSetUtil.stringValue(getArg2().computeValue(context));
return s1.indexOf(s2) != -1 ? Boolean.TRUE : Boolean.FALSE;
}
protected Object functionSubstringBefore(EvalContext context) {
assertArgCount(2);
String s1 = InfoSetUtil.stringValue(getArg1().computeValue(context));
String s2 = InfoSetUtil.stringValue(getArg2().computeValue(context));
int index = s1.indexOf(s2);
if (index == -1) {
return "";
}
return s1.substring(0, index);
}
protected Object functionSubstringAfter(EvalContext context) {
assertArgCount(2);
String s1 = InfoSetUtil.stringValue(getArg1().computeValue(context));
String s2 = InfoSetUtil.stringValue(getArg2().computeValue(context));
int index = s1.indexOf(s2);
if (index == -1) {
return "";
}
return s1.substring(index + s2.length());
}
protected Object functionSubstring(EvalContext context) {
int ac = getArgumentCount();
if (ac != 2 && ac != 3) {
assertArgCount(2);
}
String s1 = InfoSetUtil.stringValue(getArg1().computeValue(context));
double from = InfoSetUtil.doubleValue(getArg2().computeValue(context));
if (Double.isNaN(from)) {
return "";
}
from = Math.round(from);
if (ac == 2) {
if (from < 1) {
from = 1;
}
return s1.substring((int) from - 1);
}
else {
double length =
InfoSetUtil.doubleValue(getArg3().computeValue(context));
length = Math.round(length);
if (length < 0) {
return "";
}
double to = from + length;
if (to < 1) {
return "";
}
if (to > s1.length() + 1) {
if (from < 1) {
from = 1;
}
return s1.substring((int) from - 1);
}
if (from < 1) {
from = 1;
}
return s1.substring((int) from - 1, (int) (to - 1));
}
}
protected Object functionStringLength(EvalContext context) {
String s;
if (getArgumentCount() == 0) {
s = InfoSetUtil.stringValue(context.getCurrentNodePointer());
}
else {
assertArgCount(1);
s = InfoSetUtil.stringValue(getArg1().computeValue(context));
}
return new Double(s.length());
}
protected Object functionNormalizeSpace(EvalContext context) {
assertArgCount(1);
String s = InfoSetUtil.stringValue(getArg1().computeValue(context));
char chars[] = s.toCharArray();
int out = 0;
int phase = 0;
for (int in = 0; in < chars.length; in++) {
switch(chars[in]) {
case 0x20:
case 0x9:
case 0xD:
case 0xA:
if (phase == 0) { // beginning
;
}
else if (phase == 1) { // non-space
phase = 2;
chars[out++] = ' ';
}
break;
default:
chars[out++] = chars[in];
phase = 1;
}
}
if (phase == 2) { // trailing-space
out--;
}
return new String(chars, 0, out);
}
protected Object functionTranslate(EvalContext context) {
assertArgCount(3);
String s1 = InfoSetUtil.stringValue(getArg1().computeValue(context));
String s2 = InfoSetUtil.stringValue(getArg2().computeValue(context));
String s3 = InfoSetUtil.stringValue(getArg3().computeValue(context));
char chars[] = s1.toCharArray();
int out = 0;
for (int in = 0; in < chars.length; in++) {
char c = chars[in];
int inx = s2.indexOf(c);
if (inx != -1) {
if (inx < s3.length()) {
chars[out++] = s3.charAt(inx);
}
}
else {
chars[out++] = c;
}
}
return new String(chars, 0, out);
}
protected Object functionBoolean(EvalContext context) {
assertArgCount(1);
return InfoSetUtil.booleanValue(getArg1().computeValue(context))
? Boolean.TRUE
: Boolean.FALSE;
}
protected Object functionNot(EvalContext context) {
assertArgCount(1);
return InfoSetUtil.booleanValue(getArg1().computeValue(context))
? Boolean.FALSE
: Boolean.TRUE;
}
protected Object functionTrue(EvalContext context) {
assertArgCount(0);
return Boolean.TRUE;
}
protected Object functionFalse(EvalContext context) {
assertArgCount(0);
return Boolean.FALSE;
}
protected Object functionNull(EvalContext context) {
assertArgCount(0);
return null;
}
protected Object functionNumber(EvalContext context) {
if (getArgumentCount() == 0) {
return InfoSetUtil.number(context.getCurrentNodePointer());
}
assertArgCount(1);
return InfoSetUtil.number(getArg1().computeValue(context));
}
protected Object functionSum(EvalContext context) {
assertArgCount(1);
Object v = getArg1().compute(context);
if (v == null) {
return ZERO;
}
else if (v instanceof EvalContext) {
double sum = 0.0;
EvalContext ctx = (EvalContext) v;
while (ctx.hasNext()) {
NodePointer ptr = (NodePointer) ctx.next();
sum += InfoSetUtil.doubleValue(ptr);
}
return new Double(sum);
}
throw new JXPathException(
"Invalid argument type for 'sum': " + v.getClass().getName());
}
protected Object functionFloor(EvalContext context) {
assertArgCount(1);
double v = InfoSetUtil.doubleValue(getArg1().computeValue(context));
return new Double(Math.floor(v));
}
protected Object functionCeiling(EvalContext context) {
assertArgCount(1);
double v = InfoSetUtil.doubleValue(getArg1().computeValue(context));
return new Double(Math.ceil(v));
}
protected Object functionRound(EvalContext context) {
assertArgCount(1);
double v = InfoSetUtil.doubleValue(getArg1().computeValue(context));
return new Double(Math.round(v));
}
private Object functionFormatNumber(EvalContext context) {
int ac = getArgumentCount();
if (ac != 2 && ac != 3) {
assertArgCount(2);
}
double number =
InfoSetUtil.doubleValue(getArg1().computeValue(context));
String pattern =
InfoSetUtil.stringValue(getArg2().computeValue(context));
DecimalFormatSymbols symbols = null;
if (ac == 3) {
String symbolsName =
InfoSetUtil.stringValue(getArg3().computeValue(context));
symbols =
context.getJXPathContext().getDecimalFormatSymbols(symbolsName);
}
else {
NodePointer pointer = context.getCurrentNodePointer();
Locale locale;
if (pointer != null) {
locale = pointer.getLocale();
}
else {
locale = context.getJXPathContext().getLocale();
}
symbols = new DecimalFormatSymbols(locale);
}
DecimalFormat format = (DecimalFormat) NumberFormat.getInstance();
format.setDecimalFormatSymbols(symbols);
format.applyLocalizedPattern(pattern);
return format.format(number);
}
private void assertArgCount(int count) {
if (getArgumentCount() != count) {
throw new JXPathException("Incorrect number of argument: " + this);
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?