XSD abstract types and polymorphism

2019-08-06 13:20发布

问题:

I'm trying to model the following situation into an XSD schema, but kinda stuck and not sure if XSD supports what I'm trying to achieve.

I have two complex elements, which both should be abstract:

  • Session
  • SessionResult

Their relationship: one Session can contain zero or more SessionResults

Then I have these other complex types (non-abstract):

  • RaceSession (inherits from Session)
  • TimedSession (inherits from Session)
  • RaceSessionResult (inherits from SessionResult)
  • TimedSessionResult (inherits from SessionResult)

What I want to achieve is that, when a Session is of type RaceSession, only RaceSessionResult elements are allowed as SessionResult. Subsequently, when a Session is defined as a TimedSession, its SessionResult elements should be of TimedSessionResult.

Right now I'm not able to achieve this in XSD. For now as a workaround, I did not define SessionResult as a subelement-list of Session. Session serves as base for TimedSession and RaceSession, and these latter two just have TimeSessionResult or RaceSessionResult elements respectively.

Is there any way to achieve what I described above in XSD ? The purpose is then to generate c# classes out of them.

Here's the C# equivalent of what I'm trying to do.

public class Event
{
    public List<Session> Sessions { get; set; }
}

public abstract class Session
{
    public string Weather { get; set; }
    public List<SessionResult> SessionResults { get; set; }
}

public abstract class SessionResult
{
    public int Position { get; set; }
}

public class RaceSession : Session
{
    public new List<RaceSessionResult> SessionResults { get; set; }
}

public class TimedSession : Session
{
    public new List<TimedSessionResult> SessionResults { get; set; }
}

public class RaceSessionResult : SessionResult
{
    public int StartPosition { get; set; }
}

public class TimedSessionResult : SessionResult
{
    public decimal BestLapTime { get; set; }
}

Thanks a ton for any input !