我不确定我是否已根据我想要的问题正确地写了标题(问题标题太久不被承认)。
我有一个元素' 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>
...
答案 0 :(得分:1)
我可能忽略了一些东西,但我不认为这可以单独使用key / keyref来完成。它需要XSD 1.1断言,它可以很容易地表示为
<xs:assert test="every $n in nodes/node/@nodeID satisfies
exists(links/link/*/@nodeID[. eq $n])"/>