diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/ExpressionNode.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/ExpressionNode.java
index 253a39b65..92f1c17cb 100644
--- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/ExpressionNode.java
+++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/model/ExpressionNode.java
@@ -489,7 +489,7 @@ public class ExpressionNode {
if (!name.startsWith("$"))
return true;
else
- return Utilities.existsInList(name, "$this", "$total");
+ return Utilities.existsInList(name, "$this", "$total", "$index");
}
public Kind getKind() {
diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathEngine.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathEngine.java
index 23432ce6d..8fe761030 100644
--- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathEngine.java
+++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/FHIRPathEngine.java
@@ -873,6 +873,7 @@ public class FHIRPathEngine {
private Base thisItem;
private List total;
private Map aliases;
+ private int index;
public ExecutionContext(Object appInfo, Base resource, Base rootResource, Base context, Map aliases, Base thisItem) {
this.appInfo = appInfo;
@@ -881,6 +882,7 @@ public class FHIRPathEngine {
this.rootResource = rootResource;
this.aliases = aliases;
this.thisItem = thisItem;
+ this.index = 0;
}
public Base getFocusResource() {
return focusResource;
@@ -894,6 +896,14 @@ public class FHIRPathEngine {
public List getTotal() {
return total;
}
+
+ public void next() {
+ index++;
+ }
+ public Base getIndex() {
+ return new IntegerType(index);
+ }
+
public void addAlias(String name, List focus) throws FHIRException {
if (aliases == null) {
aliases = new HashMap();
@@ -908,6 +918,10 @@ public class FHIRPathEngine {
public Base getAlias(String name) {
return aliases == null ? null : aliases.get(name);
}
+ public ExecutionContext setIndex(int i) {
+ index = i;
+ return this;
+ }
}
private class ExecutionTypeContext {
@@ -1334,6 +1348,8 @@ public class FHIRPathEngine {
work.add(context.getThisItem());
} else if (atEntry && exp.getName().equals("$total")) {
work.addAll(context.getTotal());
+ } else if (atEntry && exp.getName().equals("$index")) {
+ work.add(context.getIndex());
} else {
for (Base item : focus) {
List outcome = execute(context, item, exp, atEntry);
@@ -1439,6 +1455,8 @@ public class FHIRPathEngine {
result.update(context.getThisItem());
} else if (atEntry && exp.getName().equals("$total")) {
result.update(anything(CollectionStatus.UNORDERED));
+ } else if (atEntry && exp.getName().equals("$index")) {
+ result.addType(TypeDetails.FP_Integer);
} else if (atEntry && focus == null) {
result.update(executeContextType(context, exp.getName(), exp));
} else {
@@ -4346,6 +4364,7 @@ public class FHIRPathEngine {
for (Base item : focus) {
ExecutionContext c = changeThis(context, item);
c.total = total;
+ c.next();
total = execute(c, pc, exp.getParameters().get(0), true);
}
return total;
@@ -5117,10 +5136,12 @@ public class FHIRPathEngine {
private List funcSelect(ExecutionContext context, List focus, ExpressionNode exp) throws FHIRException {
List result = new ArrayList();
List pc = new ArrayList();
+ int i = 0;
for (Base item : focus) {
pc.clear();
pc.add(item);
- result.addAll(execute(changeThis(context, item), pc, exp.getParameters().get(0), true));
+ result.addAll(execute(changeThis(context, item).setIndex(i), pc, exp.getParameters().get(0), true));
+ i++;
}
return result;
}