private XElement Map(MapState mapState, Loop loop) { var xml = new XElement(loop.Id); string previousSegmentId = null; var loopState = new MapState.LoopState(loop); mapState.LoopStates.Push(loopState); while (mapState.SegmentIndex < mapState.Segments.Count) { EdiSegment segment = mapState.Segments[mapState.SegmentIndex]; if (loopState.VisitedSegmentIds.Contains(segment.Id)) { break; } Node mapping = loop.FindMatchingNode(segment); if (mapping == null && SegmentWasUnvisitedInOuterLoops(segment, mapState)) { break; } if (mapping is Loop) { xml.Add(Map(mapState, (Loop)mapping)); } else { xml.Add(MapSegment(segment, (Segment)mapping)); mapState.SegmentIndex++; } if (previousSegmentId == null) { if (loop != _root) { loopState.VisitedSegmentIds.Add(segment.Id); } } else if (previousSegmentId != segment.Id) { loopState.VisitedSegmentIds.Add(previousSegmentId); } previousSegmentId = segment.Id; } mapState.LoopStates.Pop(); return(xml); }
private XElement Map(MapState mapState, Loop loop) { var xml = new XElement(loop.Id); string previousSegmentId = null; var loopState = new MapState.LoopState(loop); mapState.LoopStates.Push(loopState); while (mapState.SegmentIndex < mapState.Segments.Count) { EdiSegment segment = mapState.Segments[mapState.SegmentIndex]; if (loopState.VisitedSegmentIds.Contains(segment.Id)) break; Node mapping = loop.FindMatchingNode(segment); if (mapping == null && SegmentWasUnvisitedInOuterLoops(segment, mapState)) break; if (mapping is Loop) xml.Add(Map(mapState, (Loop) mapping)); else { xml.Add(MapSegment(segment, (Segment) mapping)); mapState.SegmentIndex++; } if (previousSegmentId == null) { if (loop != _root) loopState.VisitedSegmentIds.Add(segment.Id); } else if (previousSegmentId != segment.Id) loopState.VisitedSegmentIds.Add(previousSegmentId); previousSegmentId = segment.Id; } mapState.LoopStates.Pop(); return xml; }