The content model boils down to element app { (model.appStuff)*, (lem, (model.appStuff)*, (wit, (model.appStuff)*)?)?, ( (model.rdgLike, (model.appStuff)*, (wit, (model.appStuff)*)?) | (rdgGrp, (model.appStuff)*, (wit, (model.appStuff)*)?) )* } where I'm using "model.appStuff" as a placeholder for all the stuff that goes in there[1] so this is human readable. That content model is certainly bit gnarly, but not ridiculous. It could be quickly reduced in complexity if the "model.rdgLike" and "rdgGrp" clauses were combined, to wit: element app { (model.appStuff)*, (lem, (model.appStuff)*, (wit, (model.appStuff)*)?)?, ( ((model.rdgLike | rdgGrp), (model.appStuff)*, (wit, (model.appStuff)*)?) )* } It would also simplify the content model if we created a model.appPart = addSpan | damageSpan | delSpan | gap | space | figure | metamark | notatedMusic (Or whatever the right name is.) Notes ----- [1] I.e.: model.global.meta | model.global.spoken | model.milestoneLike | model.noteLike | addSpan | damageSpan | delSpan | gap | space | figure | metamark | notatedMusic