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

时间:2016-10-26 08:12:32

标签: xml xsd

我不确定我是否已根据我想要的问题正确地写了标题(问题标题太久不被承认)。

单词问题

我有一个元素' A'它包含一组关键元素(称为' a')和一个元素' B'它包含一组元素&#b; b(a1,a2)' (其中' a1'和' a2'可能是等于的,这里没有约束)。目标是实施一个强制所有' a'元素必须出现/被元素' b'

引用

案例不合适

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

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

元素a3保持不变,并且不会出现在某些' b'元件。

案例确定

答:{a1,a2,a3,a4}

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

所有' a'元素由某些''

引用

案例确定

答:{a1,a2,a3,a4}

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

所有' a'元素由某些''

引用

代码问题

XML OK

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

1 个答案:

答案 0 :(得分:1)

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

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