2014-04-21 60 views
1

由于我是XML新手,可能我的术语不正确。XML Shema:允许复杂类型的元素和属性序列

我想出了这个XML格式:

<?xml version="1.1" encoding="UTF-8"?> 

<?xml-model href="RuleBuilder.xsd" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?> 
<root> 
    <RuleBuilder:game_system 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="file:///./RuleBuilder.xsd RuleBuilder.xsd" 
     xmlns:RuleBuilder="file:///./RuleBuilder.xsd"> 
     <RuleBuilder:rule_book> 
      <RuleBuilder:title>"Warhammer The Game of Fantasy Battles"</RuleBuilder:title> 
      <RuleBuilder:page_count>100</RuleBuilder:page_count> 
      <RuleBuilder:rule> 
       <RuleBuilder:id>0</RuleBuilder:id> 
       <RuleBuilder:rule_type>"character"</RuleBuilder:rule_type> 
       <RuleBuilder:title>"Monsterous Infantry"</RuleBuilder:title> 
       <RuleBuilder:description>"This is a test"</RuleBuilder:description> 
       <RuleBuilder:page_begin>200</RuleBuilder:page_begin> 
       <RuleBuilder:related_definition>0</RuleBuilder:related_definition> 
      </RuleBuilder:rule> 
      <RuleBuilder:definition> 
       <RuleBuilder:id>0</RuleBuilder:id> 
       <RuleBuilder:term>"Monsterous Infantry"</RuleBuilder:term> 
       <RuleBuilder:definition>"A big bertha"</RuleBuilder:definition> 
       <RuleBuilder:page_begin>200</RuleBuilder:page_begin> 
       <RuleBuilder:related_rule>0</RuleBuilder:related_rule> 
      </RuleBuilder:definition> 
     </RuleBuilder:rule_book> 
    </RuleBuilder:game_system> 
</root> 

这验证只是针对此架构罚款:

<?xml version="1.0" encoding="UTF-8"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" xmlns="RuleBuilder" 
    targetNamespace="RuleBuilder" elementFormDefault="qualified" vc:minVersion="1.1"> 

    <xs:element name="game_system"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="rule_book" maxOccurs="unbounded"> 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element name="title" type="xs:string" minOccurs="1" maxOccurs="1"/>   
          <xs:element name="page_count" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
          <xs:element name="rule" maxOccurs="unbounded"> 
           <xs:complexType>   
            <xs:sequence> 
             <xs:element name="id" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="rule_type" type="xs:string" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="title" type="xs:string" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="descrpiption" type="xs:string" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="page_begin" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="related_definition" type="xs:nonNegativeInteger"/> 
             <xs:element name="related_rule" type="xs:nonNegativeInteger"/> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
          <xs:element name="definition" maxOccurs="unbounded"> 
           <xs:complexType> 
            <xs:sequence> 
             <xs:element name="id" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="term" type="xs:string" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="definition" type="xs:string" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="page_begin" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
             <xs:element name="related_definition" type="xs:nonNegativeInteger"/> 
             <xs:element name="related_rule" type="xs:nonNegativeInteger"/> 
            </xs:sequence> 
           </xs:complexType> 
          </xs:element> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

问题:我想知道如何做的是修改模式,以便我可以为“包装”复杂类型的某些元素添加属性。对于examle:

<?xml version="1.1" encoding="UTF-8"?> 

... 
<root> 
    <RuleBuilder:game_system 
     <RuleBuilder:rule_book 
      title="Warhammer Fantasy"> <!-- Notice that I move the title here --> 
      .... 
     </RuleBuilder:rule_book> 
    </RuleBuilder:game_system> 
</root> 
+0

实际上,您的实例不会使用该模式进行验证。一个块缺少'related_rule'。另一个缺少'related_definition'。它是你的模式是固定的还是你的实例? – helderdarocha

回答

2

要添加的属性,你只需要在您的rule_book元素声明的xs:complexTypexs:attribute声明:

<xs:complexType> 
    <xs:sequence> 
     <xs:element name="title" type="xs:string" minOccurs="1" maxOccurs="1"/>   
     <xs:element name="page_count" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
     <xs:element name="rule" maxOccurs="unbounded" type="RuleType"/> 
     <xs:element name="definition" maxOccurs="unbounded" type="DefinitionType"/> 
    </xs:sequence> 
    <xs:attribute name="title" type="xs:string"/> 
</xs:complexType> 

它仍然不会验证。您必须决定related_definitionrelated_rule元素的规则。在声明它们时,您提供的实例将无法验证,因为两个块都缺少其中的一个。

在下面的完整模式(它验证您的源)中,我将minOccurs="0"添加到它们两个,以便实例验证。我还将这些类型放在元素声明之外,以使文件更具可读性。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1" 
      xmlns="RuleBuilder" targetNamespace="RuleBuilder" elementFormDefault="qualified" > 

    <xs:element name="game_system"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="rule_book" maxOccurs="unbounded" type="RuleBookType" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="RuleBookType"> 
     <xs:sequence> 
      <xs:element name="title" type="xs:string" minOccurs="1" maxOccurs="1"/>   
      <xs:element name="page_count" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="rule" maxOccurs="unbounded" type="RuleType"/> 
      <xs:element name="definition" maxOccurs="unbounded" type="DefinitionType"/> 
     </xs:sequence> 
     <xs:attribute name="title" type="xs:string"/> 
    </xs:complexType> 

    <xs:complexType name="RuleType">   
     <xs:sequence> 
      <xs:element name="id" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="rule_type" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="title" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="description" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="page_begin" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="related_definition" type="xs:nonNegativeInteger" minOccurs="0"/> 
      <xs:element name="related_rule" type="xs:nonNegativeInteger" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="DefinitionType"> 
     <xs:sequence> 
      <xs:element name="id" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="term" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="definition" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="page_begin" type="xs:nonNegativeInteger" minOccurs="1" maxOccurs="1"/> 
      <xs:element name="related_definition" type="xs:nonNegativeInteger" minOccurs="0"/> 
      <xs:element name="related_rule" type="xs:nonNegativeInteger" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
+0

如何在复杂类型内部的属性中添加限制? –

+1

您可以定义一个匿名嵌套在' ...'或顶层名为 ...,您可以在其声明中<'>中引用属性的'type'。然后在'xs:simpleType'里面,你可以定义基本类型(字符串)的'',比如最大长度,某些值(枚举)甚至正则表达式。 – helderdarocha

相关问题