XSD 不同位置的特定元素
XSD specific elements in different position
我面临的问题是为我的 XML
构建正确的 XSD 架构
我有以下 XML:
<VanToRoute>
<VanId>1111</VanId>
<RouteNo>1459</RouteNo>
<RouteNo>1458</RouteNo>
<RouteNo>2459</RouteNo>
<RouteNo>1THU</RouteNo>
</VanToRoute>
<VanToRoute>
<RouteNo>2458</RouteNo>
<VanId>2222</VanId>
<RouteNo>1457</RouteNo>
<RouteNo>1NEW</RouteNo>
<RouteNo>2NEW</RouteNo>
</VanToRoute>
<VanToRoute>
<RouteNo>1215</RouteNo>
<RouteNo>2457</RouteNo>
<VanId>2222</VanId>
</VanToRoute>
<VanToRoute>
<VanId>4444</VanId>
<RouteNo>2456</RouteNo>
<RouteNo>1100</RouteNo>
<RouteNo>2465</RouteNo>
</VanToRoute>
所以重点是VanId的必填字段和RouteNo的Unbounded number。
主要挑战是设置必填字段并允许放置 XML 元素。
到目前为止我做了什么:
<xs:element minOccurs="1" maxOccurs="unbounded" name="VanToRoute">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element minOccurs="1" name="VanId" type="xs:unsignedshort" />
<xs:element minOccurs="1" name="RouteNo" type="xs:string" />
</xs:choice>
<xs:choice>
<xs:element minOccurs="1" name="RouteNo" type="xs:string" />
<xs:element minOccurs="1" name="VanId" type="xs:unsignedshort" />
</xs:choice>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="RouteNo" type="xs:string" />
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
但由于以下几个原因,此解决方案并不正确:
- 允许重复不正确的 VanId
- 将 VanId 放在我的列表末尾并不灵活。
我的问题是 - 是否有可能以某种方式模仿我想放入的逻辑?
您可以在 XSD 1.1 中使用 xs:all
和 minOccurs
/maxOccurs
在包含的元素粒子上执行此操作。
在 XSD 1.0 中,您可以将内容模型定义为
sequence
RouteNo occurs 0 to many
VanId
RouteNo occurs 0 to many
但这允许零个 RouteNo。您可以使用内容模型来解决这个问题
choice
sequence
RouteNo occurs 1 to many
VanId
RouteNo occurs 0 to many
or
sequence
RouteNo occurs 0 to many
VanId
RouteNo occurs 1 to many
我面临的问题是为我的 XML
构建正确的 XSD 架构我有以下 XML:
<VanToRoute>
<VanId>1111</VanId>
<RouteNo>1459</RouteNo>
<RouteNo>1458</RouteNo>
<RouteNo>2459</RouteNo>
<RouteNo>1THU</RouteNo>
</VanToRoute>
<VanToRoute>
<RouteNo>2458</RouteNo>
<VanId>2222</VanId>
<RouteNo>1457</RouteNo>
<RouteNo>1NEW</RouteNo>
<RouteNo>2NEW</RouteNo>
</VanToRoute>
<VanToRoute>
<RouteNo>1215</RouteNo>
<RouteNo>2457</RouteNo>
<VanId>2222</VanId>
</VanToRoute>
<VanToRoute>
<VanId>4444</VanId>
<RouteNo>2456</RouteNo>
<RouteNo>1100</RouteNo>
<RouteNo>2465</RouteNo>
</VanToRoute>
所以重点是VanId的必填字段和RouteNo的Unbounded number。
主要挑战是设置必填字段并允许放置 XML 元素。
到目前为止我做了什么:
<xs:element minOccurs="1" maxOccurs="unbounded" name="VanToRoute">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element minOccurs="1" name="VanId" type="xs:unsignedshort" />
<xs:element minOccurs="1" name="RouteNo" type="xs:string" />
</xs:choice>
<xs:choice>
<xs:element minOccurs="1" name="RouteNo" type="xs:string" />
<xs:element minOccurs="1" name="VanId" type="xs:unsignedshort" />
</xs:choice>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" name="RouteNo" type="xs:string" />
</xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
但由于以下几个原因,此解决方案并不正确:
- 允许重复不正确的 VanId
- 将 VanId 放在我的列表末尾并不灵活。
我的问题是 - 是否有可能以某种方式模仿我想放入的逻辑?
您可以在 XSD 1.1 中使用 xs:all
和 minOccurs
/maxOccurs
在包含的元素粒子上执行此操作。
在 XSD 1.0 中,您可以将内容模型定义为
sequence
RouteNo occurs 0 to many
VanId
RouteNo occurs 0 to many
但这允许零个 RouteNo。您可以使用内容模型来解决这个问题
choice
sequence
RouteNo occurs 1 to many
VanId
RouteNo occurs 0 to many
or
sequence
RouteNo occurs 0 to many
VanId
RouteNo occurs 1 to many