Accessing HL7 messages usually requires knowledge about the specified message structure, which is often not visible by looking at the printed message. To make things worse, the internal structure changes between HL7 versions. In more recent versions, primitive types are sometimes replaced with composite types having the so far used primitive as first component. This appears to be backwards compatible on printed messages, but requires different DSL expressions when obtaining field values.
Smart navigation resolves these problems by assuming reasonable defaults when repetitions or component operators are omitted
Omitting repetition operator
If a repetition operator () is omitted, the first repetition of a group, segment or field is assumed
assert message.PATIENT_RESULT.PATIENT == message.PATIENT_RESULT(0).PATIENT(0) assert group.NK1(0)(0).value == group.NK1(0).value assert group.NK1(0)(0).value == group.NK1.value
Omitting component index
If a component index is omitted, the first component or subcomponent of a composite is assumed.
def group = message.PATIENT_RESULT.PATIENT assert group.NK1(0).value == group.NK1(0).value
Combining smart navigation with finders
Both repetition on component index can be omitted.
def group = message.PATIENT_RESULT.PATIENT assert group.NK1(0)(0).value2 == group.NK1.value2
But even so, it is still required to specify the full path to the
Here, the iterative functions come to rescue. They e.g. allow to find the first structure with a given name within the message:
def phone = message.PATIENT_RESULT(0).PATIENT(0).NK1(0)(0).value phone = message.findNK1().value // equivalent