我不确定我是否正确地写了我想问的问题(问题标题太长是不允许的)。
用单词表示的问题
我有一个元素'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])"/>