If i put text events into all intervals, there is no merging of multiple (identical) steady state blocks into the IntervalsT Container. Only the challenge with the different text events by time is still there.
Example upload ZWO:
<workout>
<Warmup Duration="600" PowerLow="0.4" PowerHigh="0.6" Cadence="80">
<textevent timeoffset="10" message="Welcome"/>
<textevent timeoffset="300" message="Are you ready?"/>
<textevent timeoffset="570" message="First effort is calling! Ramp up your cadence!"/>
</Warmup>
<SteadyState Duration="180" Power="1.1" Cadence="95">
<textevent timeoffset="10" message="Come on! 1st Interval!"/>
<textevent timeoffset="90" message="Half is done..."/>
</SteadyState>
<SteadyState Duration="180" Power="0.6" Cadence="80">
<textevent timeoffset="5" message="Rest a bit."/>
</SteadyState>
<SteadyState Duration="180" Power="1.1" Cadence="95">
<textevent timeoffset="10" message="Second one!"/>
<textevent timeoffset="90" message="Half again. Keep pushing!"/>
</SteadyState>
<SteadyState Duration="180" Power="0.6" Cadence="80">
<textevent timeoffset="15" message="Keep calm."/>
</SteadyState>
<SteadyState Duration="180" Power="1.1" Cadence="95">
<textevent timeoffset="5" message="Go Go Go! You are in the 3rd interval."/>
<textevent timeoffset="90" message="Halfway!"/>
</SteadyState>
<SteadyState Duration="180" Power="0.6" Cadence="80">
<textevent timeoffset="5" message="Breath in ..."/>
<textevent timeoffset="10" message="... an out."/>
</SteadyState>
<SteadyState Duration="180" Power="1.1" Cadence="95">
<textevent timeoffset="5" message="Hit me baby one more time!"/>
<textevent timeoffset="90" message="90 seconds to go"/>
</SteadyState>
<SteadyState Duration="180" Power="0.6" Cadence="80">
<textevent timeoffset="5" message="Only one more effort left."/>
</SteadyState>
<SteadyState Duration="180" Power="1.1" Cadence="95">
<textevent timeoffset="5" message="Smash 3 minutes one last time!"/>
<textevent timeoffset="90" message="Come On! Push!"/>
<textevent timeoffset="160" message="The last seconds are running!"/>
</SteadyState>
<SteadyState Duration="180" Power="0.6" Cadence="80">
<textevent timeoffset="0" message="Breath again."/>
</SteadyState>
<Cooldown Duration="600" PowerLow="0.5" PowerHigh="0.5" Cadence="70">
<textevent timeoffset="5" message="You did it! Now recovery starts until tomorrow."/>
</Cooldown>
</workout>
Download version of this ZWO from Intervals.icu:
<workout>
<Warmup PowerHigh="0.6" PowerLow="0.4" Cadence="80" Duration="600">
<textevent message="Welcome" duration="10"/>
</Warmup>
<SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
<textevent message="Come on! 1st Interval!" duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
<textevent message="Rest a bit." duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
<textevent message="Second one!" duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
<textevent message="Keep calm." duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
<textevent message="Go Go Go! You are in the 3rd interval." duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
<textevent message="Breath in ..." duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
<textevent message="Hit me baby one more time!" duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
<textevent message="Only one more effort left." duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="1.1" Cadence="95" Duration="180">
<textevent message="Smash 3 minutes one last time!" duration="10"/>
</SteadyState>
<SteadyState show_avg="1" Power="0.6" Cadence="80" Duration="180">
<textevent message="Breath again." duration="10"/>
</SteadyState>
<Cooldown Power="0.5" Cadence="70" Duration="600">
<textevent message="You did it! Now recovery starts until tomorrow." duration="10"/>
</Cooldown>
</workout>
Edit: I have only removed the <?xml version="1.0" encoding="UTF-8" standalone="yes"?> and <workout_file> container and complete header.
@david maybe an easier way, that it is only done in background. Intervals workout builder “editor” and shown frontend only like it is. But maybe some other handling of the import in background. The original XML/ZWO is stored and while downloading or connecting Zwift, the original XML is used.
Intervals.icu stores workouts internally as the text you see in the editor. Would be hard to reconcile changes in the editor with another stored format.