private XmlSchemaParticle CannonicalizeSequence(XmlSchemaSequence sequence, bool root) {
if (sequence.Items.Count > 0) {
XmlSchemaSequence newSequence = new XmlSchemaSequence();
newSequence.MinOccurs = sequence.MinOccurs;
newSequence.MaxOccurs = sequence.MaxOccurs;
CopyPosition(newSequence, sequence, true);
foreach (XmlSchemaParticle p in sequence.Items) {
XmlSchemaParticle p1 = CannonicalizeParticle(p, false);
if (p1 != XmlSchemaParticle.Empty) {
if (p1.MinOccurs == decimal.One && p1.MaxOccurs == decimal.One && p1 is XmlSchemaSequence) {
foreach (XmlSchemaParticle p2 in ((XmlSchemaSequence)p1).Items) {
newSequence.Items.Add(p2);
}
}
else {
newSequence.Items.Add(p1);
}
}
}
sequence = newSequence;
}
if (sequence.Items.Count == 0) {
return XmlSchemaParticle.Empty;
}
else if (!root && sequence.Items.Count == 1 && sequence.MinOccurs == decimal.One && sequence.MaxOccurs == decimal.One) {
return (XmlSchemaParticle)sequence.Items[0];
}
else {
return sequence;
}
}