Skip to content

Commit

Permalink
Merge pull request #393 from tiritea/master
Browse files Browse the repository at this point in the history
Add substring-before() and substring-after() XPath functions
  • Loading branch information
dcbriccetti committed Jan 2, 2019
2 parents 23ceaae + 3169603 commit aa47832
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/org/javarosa/xpath/expr/XPathFuncExpr.java
Expand Up @@ -344,6 +344,18 @@ public Object eval (DataInstance model, EvaluationContext evalContext) {
}
} else if (name.equals("substr") && (args.length == 2 || args.length == 3)) {
return substring(argVals[0], argVals[1], args.length == 3 ? argVals[2] : null);
} else if (name.equals("substring-before") && args.length == 2) {
String str = toString(argVals[0]);
String substr = toString(argVals[1]);
int pos = str.indexOf(substr);
// XPath reference states that we should return the empty string when we don't find the substring
return pos >= 0 ? str.substring(0, pos) : "";
} else if (name.equals("substring-after") && args.length == 2) {
String str = toString(argVals[0]);
String substr = toString(argVals[1]);
int pos = str.indexOf(substr);
// XPath reference states that we should return the empty string when we don't find the substring
return pos >= 0 ? str.substring(pos + substr.length()) : "";
} else if (name.equals("contains") && args.length == 2) {
return toString(argVals[0]).contains(toString(argVals[1]));
} else if (name.equals("starts-with") && args.length == 2) {
Expand Down
10 changes: 10 additions & 0 deletions test/org/javarosa/xpath/test/XPathEvalTest.java
Expand Up @@ -250,6 +250,16 @@ public void doTests () {
testEval("substr('hello',1,4)", "ell");
testEval("substr('hello',-2)", "lo");
testEval("substr('hello',0,-1)", "hell");
testEval("substring-before('hello','l')", "he");
testEval("substring-before('hello','q')", "");
testEval("substring-before('hello','')", "");
testEval("substring-before('','')", "");
testEval("substring-before('','q')", "");
testEval("substring-after('hello','l')", "lo");
testEval("substring-after('hello','q')", "");
testEval("substring-after('hello','')", "hello");
testEval("substring-after('','')", "");
testEval("substring-after('','q')", "");
testEval("contains('a', 'a')", true);
testEval("contains('a', 'b')", false);
testEval("contains('abc', 'b')", true);
Expand Down

0 comments on commit aa47832

Please sign in to comment.