Constraints:

Signature: subexpressions() : Boolean;Description: If a StringExpression has sub-expressions, it cannot have operands and
vice versa (this avoids the problem of having to define a collating sequence
between operands and subexpressions).The OCL used here is not normative.Editor's notes: missing endifExpression: if subExpression->notEmpty() then operand->isEmpty() else operand->notEmpty() endifOriginal: if subExpression->notEmpty() then operand->isEmpty() else operand->notEmpty()

Signature: operands() : Boolean;Description: All the operands of a StringExpression must be LiteralStringsExpression: operand->forAll (op | op.oclIsKindOf (LiteralString))

Operations:

Signature: stringValue() : String;Description: The query stringValue() returns the string that concatenates, in order,
all the component string literals of all the subexpressions that are part
of the StringExpression.The OCL used here is not normative.Editor's notes: iterate not iterate().Expression: result = if subExpression->notEmpty()
then subExpression->iterate(se; stringValue = '' | stringValue.concat(se.stringValue()))
else operand->iterate(op; stringValue = '' | stringValue.concat(op.value)) endifOriginal: result = if subExpression->notEmpty() then subExpression->iterate(se; stringValue = | stringValue.concat(se.stringValue())) else operand->iterate()(op; stringValue = | stringValue.concat(op.value))