Ключ XSD / XML не найден для ограничения идентификации

#xml #xpath #xsd #keyref

#xml #xpath #xsd #keyref

Вопрос:

Прежде всего, я новичок в XSD / XML.

В общем, проблема в том, что я не очень хорошо понял, как использовать xpath атрибут.

В частности, я не могу сопоставить «элементы keyref» с соответствующими «ключевыми элементами».

Схема XSD

 <?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="NFFGs">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="NFFG" maxOccurs="unbounded" minOccurs="1"/>
            </xsd:sequence>
        </xsd:complexType>
        <xsd:unique name="NFFGnameKey">
            <xsd:selector xpath="NFFG"/>
            <xsd:field xpath="@NFFGname"/>
        </xsd:unique>
    </xsd:element>

    <xsd:element name="NFFG">
        <xsd:complexType>
            <xsd:sequence>

                <xsd:element name="nodes" type="nodes_t" minOccurs="1" maxOccurs="1"/>

                <xsd:element name="links" type="links_t" minOccurs="1" maxOccurs="1"/>

                <xsd:element name="policies" type="policies_t" minOccurs="1" maxOccurs="1"/>

            </xsd:sequence>
            <xsd:attribute name="NFFGname" type="xsd:string" use="required"/>
        </xsd:complexType>
        <xsd:unique name="linkKey">
            <xsd:selector xpath="links/link"/>
            <xsd:field xpath="@linkID"/>
        </xsd:unique>
        <xsd:key name="node-key-id">
            <xsd:selector xpath="nodes/node"/>
            <xsd:field xpath="@nodeID"/>
        </xsd:key>
        <xsd:keyref name="dummySRC" refer="node-key-id">
            <xsd:selector xpath="links/link/SRC"/>
            <xsd:field xpath="@nodeID"/>
        </xsd:keyref>
        <xsd:keyref name="dummyDST" refer="node-key-id">
            <xsd:selector xpath="links/link/DST"/>
            <xsd:field xpath="@nodeID"/>
        </xsd:keyref>
        <xsd:keyref name="dummySRC1" refer="node-key-id">
            <xsd:selector xpath="policies/policy/reachability"/>
            <xsd:field xpath="@SRC"/>
        </xsd:keyref>
        <xsd:keyref name="dummyDST1" refer="node-key-id">
            <xsd:selector xpath="policies/policy/reachability"/>
            <xsd:field xpath="@DST"/>
        </xsd:keyref>
    </xsd:element>

    <xsd:complexType name="nodes_t">
        <xsd:sequence>
            <xsd:element name="node" type="node_t" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="node_t">
        <xsd:attribute name="nodeID" type="xsd:string" use="required"/>
        <xsd:attribute ref="functionalType"/>
    </xsd:complexType>

    <xsd:complexType name="links_t">
        <xsd:sequence>
            <xsd:element name="link" type="link_t" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="link_t">
        <xsd:sequence>
            <xsd:element name="SRC" type="nodeRef" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="DST" type="nodeRef" minOccurs="1" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="linkID" type="xsd:string" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="nodeRef">
        <xsd:attribute name="nodeID"/>
    </xsd:complexType>

    <xsd:attribute name="functionalType">
        <xsd:simpleType>
            <xsd:restriction base="xsd:string">
                <xsd:enumeration value="firewall"/>
                <xsd:enumeration value="DPI"/>
                <xsd:enumeration value="NAT"/>
                <xsd:enumeration value="antispam"/>
                <xsd:enumeration value="web-cache"/>
                <xsd:enumeration value="VPN-gateway"/>
                <xsd:enumeration value="web-server"/>
                <xsd:enumeration value="web-client"/>
                <xsd:enumeration value="mail-server"/>
                <xsd:enumeration value="mail-client"/>
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:attribute>

    <xsd:complexType name="policies_t">
        <xsd:sequence>
            <xsd:element name="policy" type="policy_t" minOccurs="1" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="policy_t">
        <xsd:sequence>
            <xsd:element name="reachability" type="reachability_t"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="reachability_t">
        <xsd:sequence>
            <xsd:element name="reachability_verified" type="xsd:boolean"/>
            <xsd:element name="trasversal" type="trasversal_t" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="SRC" use="required"/>
        <xsd:attribute name="DST" use="required"/>
    </xsd:complexType>

    <xsd:complexType name="trasversal_t">
        <xsd:sequence>
            <xsd:element name="trasversal" type="xsd:boolean" fixed="true"/>
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>
  

Пример XML

 <?xml version="1.0"?>
<NFFGs
        xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"
        xsd:noNamespaceSchemaLocation="nffgInfo.xsd"
>

    <NFFG NFFGname="nffg-1">
        <nodes>
            <node nodeID="n1" functionalType="web-client"/>
            <node nodeID="n2" functionalType="firewall"/>
            <node nodeID="n3" functionalType="NAT"/>
            <node nodeID="n4" functionalType="web-server"/>
            <node nodeID="n5" functionalType="web-server"/>
        </nodes>
        <links>
            <link linkID="l1">
                <SRC nodeID="n1" />
                <DST nodeID="n5"/>
            </link>
            <link linkID="l2">
                <SRC nodeID="n4" />
                <DST nodeID="n5"/>
            </link>
        </links>
        <policies>
            <policy>
                <reachability SRC="n7" DST="n2">
                    <reachability_verified>false</reachability_verified>
                </reachability>
            </policy>
        </policies>
    </NFFG>

</NFFGs>
  

Ошибка, которую я выдаю, является:

введите описание изображения здесь

Предложения и / или рекомендации любого рода, даже не относящиеся к теме проблемы, приветствуются.

Комментарии:

1. У меня есть подозрение: key element: node это node_t тип, а keyref element: links/link/SRC (например) не note_t тип, а является nodeRef типом. Я попытался изменить keyref element: links/link/SRC на node_t тип, и, похоже, это работает. Но для меня это не имеет смысла.

2. да, похоже, это ответ, даже если вы установите для nodeRef значение типа string, это тоже сработает. Похоже, что, поскольку по умолчанию xsd:type для атрибутов равен «anySimpleType», он не будет соответствовать узлам, потому что они имеют сложный тип node_t