我正在处理 xml 和 xsd,我的 xsd 中有几个不同的元素,在所有元素中我希望其中一些是唯一的。
这是我的 xml 文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<LIST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<PRODUCT>
<TYPE>SecurityGateway</TYPE>
<PRIMARY_IP>192.168.0.23</PRIMARY_IP>
<PRIMARY_SUBNET_MASK>255.255.0.0</PRIMARY_SUBNET_MASK>
<PRIMARY_PORT>443</PRIMARY_PORT>
<SECONDARY_IP>192.168.0.66</SECONDARY_IP>
<SECONDARY_SUBNET_MASK>255.255.128.0</SECONDARY_SUBNET_MASK>
<SECONDARY_PORT>443</SECONDARY_PORT>
</PRODUCT>
<PRODUCT>
<TYPE>SecurityGateway</TYPE>
<PRIMARY_IP>192.168.0.66</PRIMARY_IP>
<PRIMARY_SUBNET_MASK>255.255.0.0</PRIMARY_SUBNET_MASK>
<PRIMARY_PORT>443</PRIMARY_PORT>
</PRODUCT>
<PRODUCT>
<TYPE>SecurityGateway</TYPE>
<PRIMARY_HOST_NAME>xx.yy.zz</PRIMARY_HOST_NAME>
<PRIMARY_PORT>443</PRIMARY_PORT>
</PRODUCT>
</LIST>
我想要一个 xsd 来检测某个 IP 地址是否多次出现,无论它是在 PRIMARY_IP 还是 SECONDARY_IP 中都无关紧要。 正如你所看到的,在我的 xml 中,产品 1 的 PRIMARY_IP 等于产品 2 的 SECONDARY_IP -> 我想拒绝这种 xml,因为两个产品不可能共享相同的 IP。
这是我的 xsd 的摘录:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="_IPv4Address">
<xs:restriction base="xs:string">
<xs:pattern value="(([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.){3}([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="_Hostname">
<xs:restriction base="xs:string">
<xs:minLength value="1" />
<xs:maxLength value="255" />
<xs:pattern value="([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="LIST">
<xs:complexType>
<xs:sequence>
<!-- details of each product element -->
<xs:element name="PRODUCT" minOccurs="1" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="TYPE" type="xs:string" minOccurs="1" maxOccurs="1">
</xs:element>
<!-- Either product is accessible by static IP or by hostname -->
<xs:choice minOccurs="1" maxOccurs="1">
<xs:sequence>
<xs:element name="PRIMARY_IP" type="_IPv4Address">
</xs:element>
<xs:element name="PRIMARY_SUBNET_MASK" type="_IPv4Address">
</xs:element>
<xs:element name="PRIMARY_PORT" type="xs:unsignedShort" minOccurs="1" maxOccurs="1">
</xs:element>
</xs:sequence>
<xs:sequence>
<xs:element name="PRIMARY_HOST_NAME" type="_Hostname">
</xs:element>
<xs:element name="PRIMARY_PORT" type="xs:unsignedShort" minOccurs="1" maxOccurs="1">
</xs:element>
</xs:sequence>
</xs:choice>
<!-- Product can also have a secondary IP or hostname -->
<xs:choice minOccurs="0" maxOccurs="1">
<xs:sequence>
<xs:element name="SECONDARY_IP" type="_IPv4Address">
</xs:element>
<xs:element name="SECONDARY_SUBNET_MASK" type="_IPv4Address">
</xs:element>
<xs:element name="SECONDARY_PORT" type="xs:unsignedShort">
</xs:element>
</xs:sequence>
<xs:sequence>
<xs:element name="SECONDARY_HOST_NAME" type="_Hostname">
</xs:element>
<xs:element name="SECONDARY_PORT" type="xs:unsignedShort">
</xs:element>
</xs:sequence>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
谢谢您的帮助。
我尝试将其添加到我的 xsd 中,但它不起作用,因为它只比较“相同”元素的值:
<xs:unique name="uniquePRIMARY_IP">
<xs:selector xpath="PRODUCT"/>
<xs:field xpath="PRIMARY_IP"/>
</xs:unique>
<xs:unique name="uniquePRIMARY_Hostname">
<xs:selector xpath="PRODUCT"/>
<xs:field xpath="PRIMARY_HOST_NAME"/>
</xs:unique>
<xs:unique name="uniqueSECONDARY_IP">
<xs:selector xpath="PRODUCT"/>
<xs:field xpath="SECONDARY_IP"/>
</xs:unique>
<xs:unique name="uniqueSECONDARY_HOSTNAME">
<xs:selector xpath="PRODUCT"/>
<xs:field xpath="SECONDARY_HOST_NAME"/>
</xs:unique>
尝试使用
LIST
和 <selector path="PRODUCT/PRIMARY_IP | PRODUCT/SECONDARY_IP"/>
进行唯一性约束(在
<field path="."/>
元素级别)