xsd:具有唯一值的元素

问题描述 投票:0回答:1

我正在处理 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>
xml xsd
1个回答
0
投票

尝试使用

LIST
<selector path="PRODUCT/PRIMARY_IP | PRODUCT/SECONDARY_IP"/>
 进行唯一性约束(在 
<field path="."/>

元素级别)
© www.soinside.com 2019 - 2024. All rights reserved.