2011-05-07 28 views
1

这里是我的xml文档元素出现在指定数量

<root> 
<num>3</num> 
<a> 
    <b> 
    <c n="m"></c> 
    <c></c> 
    <c n="e"></c> 
    </b> 
    <b> 
    <c n="s"></c> 
    <c n="w"></c> 
    <c></c> 
    </b> 
    <b> 
    <c n="q"></c> 
    <c></c> 
    <c n="u"></c> 
    </b> 
</a> 
</root> 

我想创建一个XML模式。
b中的元素c只能出现n次(n表示num元素)
我认为它使用key,keyref或unique。

回答

0

这是不可能的。

Key,keyref和unique将无济于事。独特将确保您没有重复项目。并且key和keyref将确保就地B中的元素与那些元素匹配。

maxOccurs限制需要一个简单的整数参数。无法通过任何种类的Xpath表达式来计算整数。如果你想解决具有独特的,关键和重点参考你的问题,你必须创建一个属性的数量指标http://www.w3.org/TR/xmlschema-0/#OccurrenceConstraints

更新

:在这里看到。下图展示了架构:

enter image description here

你必须将属性添加到它引用主属性索引您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节点的数量,并检查它们是否全部相同或全部等于给定数量。这样做会更有意义,因为这是执行限制的唯一可靠方法。

+0

thx。没有办法做到这一点。 – 2011-05-07 16:40:01

+0

所以唯一的办法是maxOccurs =“unbounded” – 2011-05-07 16:41:51