Dev:SemanticConstraints
|
Semantic constraints
XML Schema Definitions (XSDs) offer a variety of possibilities to define syntactic constraints, describing the syntax of an XML file, including the type and multiplicity of an element. For example in railML® 2, it is possible to describe and validate that a <train> must reference one or more <trainPart>s, that all <trackElements> must have a position on the <track>, that the length of a <tunnel> is a decimal number and that allowed positions of <couplers> are at the front, rear or both ends of a <wagon>. However, XML Schema Definitions are not able to express a constraint on one element or attribute that depends on the value or existence of another element or attribute. One example is that an XSD cannot express that a departure time must be greater than or equal to the arrival time, or that it does not make sense to specify a stopOnRequest and at the same time that the train is not allowed to stop. Such rules restricting the contents, or semantics, of one element or attribute depending on other content, are called semantic constraints.
Semantic constraints are as important as syntactic constraints. If they are ignored, other software may not be able to handle your railML® files, or may interpret the contents in different ways. Therefore, their implementation will be checked during certification.
Elements with approved semantic constraints are listed in Category:Semantic constraints. On the element documentation pages, the semantic constraints can be found in a dedicated chapter below the syntactic constraints. Proposed semantic constraints are listed in Category:Semantic constraints_proposed. A list of the semantic constraints by introduction date of a can be found below.
Every application of railML® has to be checked not only on XSD compliance but also on the obedience to the semantic constraints.
How to introduce Semantic Constraints
Before proposing a semantic constraint, please note:
- The purpose of semantic constraints is to restrict the allowed values of one property depending on the values of other properties.
- Descriptions of the meaning of an element or property belong in the schema documentation. This includes how (not) to interpret or use possible values of a property.
- Constraints that can be described by XML Schema Definitions (XSDs) should be implemented syntactically in the schemas. Please, follow the guideline for participating in the development process. If a constraint cannot be described by XML Schema Definitions, you can propose a semantic constraint.
Semantic constraints can be proposed either by one of the railML® working groups (link to the railML® website) or suggested by anyone through the following process:
- If you see the need for a semantic constraint beyond the schema, please propose it in the forum (link to the railML® website). The responsible schema coordinator will bring it to the relevant working group or directly to the group of coordinators.
- If there is consensus in a working group to add a new semantic constraint, a post will be made in the forum and the proposed constraint will be added to the element documentation using Template:Semcon, with
status=proposed
and added to the list below. The other working groups will also be notified, so they can check if the proposed constraint affects their use cases. - After the community has been given a reasonable time to raise any objections in the forum, the coordinators will decide if the proposed semantic constraint is approved. Following this decision, the documentation will be updated accordingly.
|
|
Design guidelines
- Implement a seperate semantic constraint for every rule.
- Remember that all new semantic constraints must be proposed in the forum (link to the railML® website)
- Use the template with all mandatory arguments according to Template:SemanticConstraint.
- Record the semantic constraint on the respective list below (Dev:Semantic_Constraints/table2 for railML® 2 and Dev:Semantic_Constraints/table3 for railML® 3).
- assign a serial id to the semantic constraint according to the appropriate list below.
Current Constraints as of railML 2.5
View/edit list on the separate source page.
Element | ID | Proposal date | Date of acceptance | Date of deprecation | Description |
---|---|---|---|---|---|
<TT:timetablePeriod> | TT:001 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with other validity periods. | |
<TT:specialService> | CO:002 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. | |
<TT:operatingPeriodRef> | CO:002 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. | |
<TT:operatingPeriod> | CO:002 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. | |
<TT:operatingDay> | TT:019 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with other <operatingDay> validity periods of the same enclosing <operatingPeriod>. | |
<TT:circulation> | CO:002 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. | |
<TT:blockPart> | CO:002 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. | |
<RS:designator> (introduced with version 2.5) | RS:001 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with the validity periods of other entries of the same register of the same enclosing <state>. | |
<RS:operator> | RS:002 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with other <operator> validity periods of the same enclosing <vehicle>/<classification>. | |
<RS:owner> (introduced with version 2.5) | RS:003 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with other <owner> validity periods of the same enclosing <vehicle>/<classification>. | |
<RS:state> | RS:004 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with other <state> validity periods of the same enclosing <vehicle>/<states>. | |
<IS:state> | IS:020 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with other <state> validity periods of the same enclosing <states> collection. See also Dev:Defining temporal availability of infrastructure elements and speed profiles. | |
<IS:state (with length)> | IS:021 | 2018-11-12 | 2019-03-21 | Must not overlap with other <state (with length)> validity periods of the same enclosing <states (with length)> collection. See also Dev:Defining temporal availability of infrastructure elements and speed profiles. | |
<IS:designator> | CO:001 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with the validity periods of other entries of the same register of the same enclosing element. | |
<CO:designator> (introduced with version 2.5) | CO:001 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. Must not overlap with the validity periods of other entries of the same register of the same enclosing element. | |
<CO:phase> (introduced with version 2.5) | CO:002 | 2018-11-12 | 2019-03-21 | Any starting time stamp (as it may result e.g. from a combination of startDate and startTime) shall be lower or equal any ending time stamp (e.g. endDate) if both are given. | |
<TT:ocpTT> | TT:002 | 2018-10-25 | 2019-06-20 | The attribute sequence is shall be increasing according to the train path. | |
2018-10-25 | discarded | ||||
<TT:blockPart> | TT:003 | 2019-07-13 | 2019-07-18 | By means of a <blockPart> it is possible to model both journeys with and without reference to a <trainPart> within a roster, as well as services without change of location (without reference to a <trainPart>). These 3 basic types are distinguished by the attribute mission. The following table presents the semantic constraints: see table | |
<TT:blockPart> | TT:004 | 2019-07-20 | 2019-07-18 | vehicleRef and formationRef shall not be used within the same blockPart, since a blockPart is either one for a certain vehicle or one for a whole formation. The only exception to this rule is if the formation consists of only one vehicle that is also specified via vehicleRef | |
<TT:rostering> | TT:005 | 2019-05-22 | 2019-06-25 | vehicleRef and formationRef are to be used exceptional since the circulation plan is either one for a certain vehicle or one for a whole formation. The only exception to this rule is if the formation consists of only one vehicle that is also specified via vehicleRef | |
<TT:stopDescription> | TT:006 | 2018-09-03 | 2019-06-20 | Constraints between the attributes <ocpTT>.ocpType, <stopDescription>.guaranteedPass, .commercial, .onOff, .stopOnRequest and .operationalStopOrdered | |
TT:007 | 2019-06-19 | discarded | 2020-04-23 | ||
<TT:trackInfo> | TT:009 | 2018-08-21 | 2019-06-20 | The operating days of the <operatingPeriodRef>s of the individual <trackInfo> entries must be disjoint and must not contain more traffic days than the parent <trainPart>. If fewer traffic days are provided in the <trackInfo> entries than the parent <trainPart> contains, the information (e.g. attribute trackInfo) of the parent <ocpTT> must be evaluated for these operating days. | |
<TT:times> | TT:011 | 2019-06-19 | discarded | ||
<TT:times> | TT:012 | 2019-06-19 | 2022-06-02 | When @scope='actual' is used, then the operating period and/or timetable period specified at the trainpart level shall refer to only one operating day. Like this the operating day to which the actual times refer is defined. | |
<TT:times> | TT:013 | 2019-06-19 | discarded | ||
<TT:times> (Arrival times for passing OCP's) | TT:014 | 2019-06-19 | 2022-06-02 | @arrival is not to be specified if the attribute ocpType of the parent <ocpTT> has the value pass - use departure for run-through (passing) times; This is in line with the definition of @arrival as the moment at which the train ends its movement and gets to a halt at the parent <ocpTT>. | |
<TT:times> (Arrival time at first OCP) | TT:015 | 2019-06-19 | 2022-06-02 | Arrival times at the common operating point of two consecutive <trainPart>'s of the same <train> must not contradict each other. This can be implemented either
| |
<TT:times> (Departure time at last OCP) | TT:016 | 2020-10-09 | 2022-06-02 | Departure times at the common operating point of two consecutive <trainPart>'s of the same <train> must not contradict each other. This can be implemented either
| |
<TT:connection> | TT:017 | 2022-12-15 | 2022-12-15 | If the trainPartRef attribute is given, then there must also be a trainRef attribute, and the trainPartRef attribute must point to a train part of the train referenced by the trainRef attribute. | |
IS:001 | 2019-04-11 | discarded | |||
<IS:trackEnd> | IS:002 | 2019-06-17 |
| ||
<IS:trackBegin> | IS:003 | 2019-06-17 |
| ||
<IS:mileageChange> | IS:006 | 2019-06-19 |
| ||
IS:007 | 2020-02-25 | discarded | |||
<IS:uptime> | IS:008 | 2020-02-28 | An <ocp> with <propOperational>@operationalType=blockSignal shall not have
@mode=manned (as a manned blockSignal shall be modelled in railML® 2.x as a blockPost). | ||
<IS:uptime> | IS:009 | 2020-02-28 | An <ocp> with attribute <propOperational>@operationalType=stoppingPoint shall not have @mode=manned (as a stoppingPoint has no operational usage and therefore no operational staff by the IM). | ||
<IS:uptime> | IS:010 | 2020-02-28 | An enumeration of several time periods by @from and @until for one <ocp> shall not overlap so that for every time there shall be a unique status of <uptime>. | ||
2024-10-02 (railML.org Governance Coord approved) |
| ||||
<IS:speedProfile> | IS:012 | 2022-03-14 | @basicSpeedProfile is always linked with @influence=increasing | ||
<IS:speedProfile> | IS:013 | 2022-03-14 |
| ||
<IS:tunnel> | IS:014 | 2022-03-14 | Define the tunnel resistance factor @resistanceFactorPassenger resp. @resistanceFactorFreight only if @kind and @crossSection are not known. | ||
<IS:ocp> | IS:015 | 2022-07-14 | 2022-08-11 | When specifying @parentOcpRef for an <ocp> circles are not allowed. That means that when following the chain of @parentOcpRef no <ocp> shall be visited twice. | |
<TT:times> | TT:020 | 2024-11-21 | No two attributes //<times>/@scope of the same enclosing stop/pass elements shall have the same value. | ||
<TT:specialService> | TT:021 | 2025-02-13 | Within the same enclosing element, a date must not be contained in more than one <specialService> element. | ||
<TT:specialService> | TT:022 | 2025-02-13 | The values of @singleDate, @startDate and @endDate of <specialService> must not be outside of the time period defined in the related <operatingPeriod>. |