我可以在 xsd 中创建一个没有父元素的选择吗?
Can I make a type in xsd to be a choice without the parent element?
我在 .xsd
、IP
和 IPv6
中定义了 2 种类型。我需要在我的 .xml
文件中包含一个元素,以便它是这两种类型中的一种。
为此我想我可能会使用 xsd:choice
但问题是它暗示了一个父元素,例如:
<xs:element name="remote_ip">
<xs:complexType>
<xs:choice>
<xs:element name="remote_ip" type="IP"/>
<xs:element name="remote_ip" type="IPv6"/>
</xs:choice>
</xs:complexType>
</xs:element>
这允许我在 .xml
中执行以下操作:
<remote_ip>
<remote_ip>10.0.0.1</remote_ip>
</remote_ip>
我需要以下内容:
<remote_ip>10.0.0.1</remote_ip>
IP
和 IPv6
类型定义:
<xs:simpleType name="IP">
<xs:restriction base="xs:string">
<xs:pattern value="([0-9]*\.){3}[0-9]*" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IPv6">
<xs:annotation>
<xs:documentation>
An IP version 6 address, based on RFC 1884.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:token">
<!-- Fully specified address -->
<xs:pattern value="[0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7}"/>
<!-- Double colon start -->
<xs:pattern value=":(:[0-9A-Fa-f]{1,4}){1,7}"/>
<!-- Double colon middle -->
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,6}(:[0-9A-Fa-f]{1,4}){1}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,5}(:[0-9A-Fa-f]{1,4}){1,2}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,4}(:[0-9A-Fa-f]{1,4}){1,3}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,3}(:[0-9A-Fa-f]{1,4}){1,4}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,2}(:[0-9A-Fa-f]{1,4}){1,5}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1}(:[0-9A-Fa-f]{1,4}){1,6}"/>
<!-- Double colon end -->
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,7}:"/>
<!-- Embedded IPv4 addresses -->
<xs:pattern value="((:(:0{1,4}){0,3}(:(0{1,4}|[fF]{4}))?)|(0{1,4}:(:0{1,4}){0,2}(:(0{1,4}|[fF]{4}))?)|((0{1,4}:){2}(:0{1,4})?(:(0{1,4}|[fF]{4}))?)|((0{1,4}:){3}(:(0{1,4}|[fF]{4}))?)|((0{1,4}:){4}(0{1,4}|[fF]{4})?)):(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])"/>
<!-- The unspecified address -->
<xs:pattern value="::"/>
</xs:restriction>
</xs:simpleType>
你想要一个联合类型:
<xs:element name="remote_ip" type="IPv4_or_IPv6"/>
<xs:simpleType name="IPv4_or_IPv6">
<xs:union memberTypes="IPv4 IPv6"/>
</xs:simpleType>
我在 .xsd
、IP
和 IPv6
中定义了 2 种类型。我需要在我的 .xml
文件中包含一个元素,以便它是这两种类型中的一种。
为此我想我可能会使用 xsd:choice
但问题是它暗示了一个父元素,例如:
<xs:element name="remote_ip">
<xs:complexType>
<xs:choice>
<xs:element name="remote_ip" type="IP"/>
<xs:element name="remote_ip" type="IPv6"/>
</xs:choice>
</xs:complexType>
</xs:element>
这允许我在 .xml
中执行以下操作:
<remote_ip>
<remote_ip>10.0.0.1</remote_ip>
</remote_ip>
我需要以下内容:
<remote_ip>10.0.0.1</remote_ip>
IP
和 IPv6
类型定义:
<xs:simpleType name="IP">
<xs:restriction base="xs:string">
<xs:pattern value="([0-9]*\.){3}[0-9]*" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IPv6">
<xs:annotation>
<xs:documentation>
An IP version 6 address, based on RFC 1884.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:token">
<!-- Fully specified address -->
<xs:pattern value="[0-9A-Fa-f]{1,4}(:[0-9A-Fa-f]{1,4}){7}"/>
<!-- Double colon start -->
<xs:pattern value=":(:[0-9A-Fa-f]{1,4}){1,7}"/>
<!-- Double colon middle -->
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,6}(:[0-9A-Fa-f]{1,4}){1}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,5}(:[0-9A-Fa-f]{1,4}){1,2}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,4}(:[0-9A-Fa-f]{1,4}){1,3}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,3}(:[0-9A-Fa-f]{1,4}){1,4}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,2}(:[0-9A-Fa-f]{1,4}){1,5}"/>
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1}(:[0-9A-Fa-f]{1,4}){1,6}"/>
<!-- Double colon end -->
<xs:pattern value="([0-9A-Fa-f]{1,4}:){1,7}:"/>
<!-- Embedded IPv4 addresses -->
<xs:pattern value="((:(:0{1,4}){0,3}(:(0{1,4}|[fF]{4}))?)|(0{1,4}:(:0{1,4}){0,2}(:(0{1,4}|[fF]{4}))?)|((0{1,4}:){2}(:0{1,4})?(:(0{1,4}|[fF]{4}))?)|((0{1,4}:){3}(:(0{1,4}|[fF]{4}))?)|((0{1,4}:){4}(0{1,4}|[fF]{4})?)):(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])"/>
<!-- The unspecified address -->
<xs:pattern value="::"/>
</xs:restriction>
</xs:simpleType>
你想要一个联合类型:
<xs:element name="remote_ip" type="IPv4_or_IPv6"/>
<xs:simpleType name="IPv4_or_IPv6">
<xs:union memberTypes="IPv4 IPv6"/>
</xs:simpleType>