这是不可能的。
Key,keyref和unique将无济于事。独特将确保您没有重复项目。并且key和keyref将确保就地B中的元素与那些元素匹配。
maxOccurs限制需要一个简单的整数参数。无法通过任何种类的Xpath表达式来计算整数。如果你想解决具有独特的,关键和重点参考你的问题,你必须创建一个属性的数量指标http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints
更新
:在这里看到。下图展示了架构:
你必须将属性添加到它引用主属性索引您c
节点。在这个例子中它存储在多个num元素中。您可以在/root/[email protected]
上输入一个整数限制,一个唯一键和一个关键限制。之后,您创建一个从/root/a/b/[email protected]
到/root/[email protected]
的参考约束。这将创建一个最大限制。您可以将尽可能多的c
节点作为num
节点,但也可以少一些。
这是架构:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="root">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="num" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="count" type="xs:unsignedInt" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="a" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="b" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="c" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="count" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="num_unique">
<xs:selector xpath="num"/>
<xs:field xpath="@count"/>
</xs:unique>
<xs:key name="num_key">
<xs:selector xpath="num"/>
<xs:field xpath="@count"/>
</xs:key>
<xs:keyref name="num_ref" refer="num_key">
<xs:selector xpath="a/b/c"/>
<xs:field xpath="@count"/>
</xs:keyref>
</xs:element>
</xs:schema>
,这将是一个有效的文件:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="root.xsd">
<num count="1"/>
<num count="2"/>
<num count="3"/>
<a>
<b>
<c count="1"/>
</b>
<b>
<c count="1"/>
<c count="2"/>
</b>
</a>
</root>
如果添加<c count="4"/>
将变得无效。现在我不知道如何使它成为身份参考。也许有可能扭转参考方向...
但是永远不要将约束放入与数据本身相同的文件中。如果你不相信你的数据源,那么询问你的数据源是否有自我限制是没有什么意义的。您必须将约束放入模式或通过某种程序逻辑扩展验证。例如,您可以统计父节点中所有c
节点的数量,并检查它们是否全部相同或全部等于给定数量。这样做会更有意义,因为这是执行限制的唯一可靠方法。
thx。没有办法做到这一点。 – 2011-05-07 16:40:01
所以唯一的办法是maxOccurs =“unbounded” – 2011-05-07 16:41:51