如何实现关键元素必须出现在引用元素XML Schema中



我不确定我是否正确地写了我想问的问题(问题标题太长是不允许的)。

用单词表示的问题

我有一个元素'A'包含一组关键元素(称为'A')和一个元素'B'包含一组元素'B (a1,a2)'(其中'a1'和'a2'可以相等,这里没有约束)。目标是实现一个XML规则,强制所有'a'元素必须由'b'元素出现/引用。

不需要大小写:

A:{a1, a2, a3, a4, a5}

B:{b1(a1, a5), b2(a2, a4)}

元素a3单独存在,不出现在某个'b'元素中。

情况好:

A:{a1, a2, a3, a4}

B:{b1(a1, a4), b2(a2, a3)}

所有'a'元素都被某个'b'引用。

情况好:

A:{a1, a2, a3, a4}

B: {b1 (a1, a2) b2 (a1, a2), b3 (a1、a3), b4 (a4, a4}

所有'a'元素都被某个'b'引用。

问题代码

XML好

...
<nodes>
    <node nodeID="n1" functionalType="WEB_CLIENT"/>
    <node nodeID="n2" functionalType="FW"/>
    <node nodeID="n3" functionalType="NAT"/>
    <node nodeID="n6" functionalType="NAT"/>
    <node nodeID="n4" functionalType="WEB_SERVER"/>
    <node nodeID="n5" functionalType="WEB_SERVER"/>
    <node nodeID="n10" functionalType="WEB_SERVER"/>
</nodes>
<links>
    <link linkID="l1">
        <SRC nodeID="n1"/>
        <DST nodeID="n2"/>
    </link>
    <link linkID="l2">
        <SRC nodeID="n2"/>
        <DST nodeID="n3"/>
    </link>
    <link linkID="l4">
        <SRC nodeID="n3"/>
        <DST nodeID="n4"/>
    </link>
    <link linkID="l5">
        <SRC nodeID="n3"/>
        <DST nodeID="n6"/>
    </link>
    <link linkID="l6">
        <SRC nodeID="n6"/>
        <DST nodeID="n5"/>
    </link>
</links>
...

保留元素node nodeID="n10"

部分XML Schema:

...
<xsd:key name="linkKey">
    <xsd:selector xpath="links/link"/>
    <xsd:field xpath="@linkID"/>
</xsd:key>
<xsd:key name="nodeKey">
    <xsd:selector xpath="nodes/node"/>
    <xsd:field xpath="@nodeID"/>
</xsd:key>
<xsd:keyref name="dummy1" refer="nodeKey">
    <xsd:selector xpath="links/link/SRC"/>
    <xsd:field xpath="@nodeID"/>
</xsd:keyref>
<xsd:keyref name="dummy2" refer="nodeKey">
    <xsd:selector xpath="links/link/DST"/>
    <xsd:field xpath="@nodeID"/>
</xsd:keyref>
...

和元素类型的定义:

...
<!-- Nodes -->
<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>

<!-- Links -->
<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="node_t" minOccurs="1" maxOccurs="1"/>
        <xsd:element name="DST" type="node_t" minOccurs="1" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="linkID" type="xsd:string" use="required"/>
</xsd:complexType>
...

我可能忽略了一些东西,但我不认为这可以单独使用key/keyref来完成。它需要XSD 1.1断言,它可以相当容易地表示为

<xs:assert test="every $n in nodes/node/@nodeID satisfies
                 exists(links/link/*/@nodeID[. eq $n])"/>

最新更新