XML,XSD XS:递归的复杂类型定义内keyref

问题描述:

我有一个在顶部,并允许类型的列表对象和参照允许的类型子对象的递归列表类型的一些XML数据:XML,XSD XS:递归的复杂类型定义内keyref

<?xml version="1.0" encoding="UTF-8"?> 
<ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KEYREF_TEST.xsd"> 
    <ALLOWED_SHAPE_TYPES> 
    <SHAPE_TYPE>Circle</SHAPE_TYPE> 
    <SHAPE_TYPE>Triangle</SHAPE_TYPE> 
    <SHAPE_TYPE>Square</SHAPE_TYPE> 
    </ALLOWED_SHAPE_TYPES> 
    <SHAPES> 
    <SHAPE> 
     <TYPE>Triangle</TYPE> 
     <SUB_SHAPES> 
     <SHAPE> 
      <TYPE>Circle</TYPE> 
      <SUB_SHAPES/> 
     </SHAPE> 
     <SHAPE> 
      <TYPE>Square</TYPE> 
      <SUB_SHAPES> 
      <SHAPE> 
       <TYPE>Triangle</TYPE> 
       <SUB_SHAPES/> 
      </SHAPE> 
      </SUB_SHAPES> 
     </SHAPE> 
     </SUB_SHAPES> 
    </SHAPE> 
    <SHAPE> 
     <TYPE>Square</TYPE> 
     <SUB_SHAPES/> 
    </SHAPE> 
    </SHAPES> 
</ROOT> 

如下我已经定义了验证这个文档的架构:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="ROOT"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="ALLOWED_SHAPE_TYPES"> 
      <xs:complexType> 
      <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
       <xs:element name="SHAPE_TYPE" type="xs:string"/> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     <xs:element name="SHAPES" type="shape-list-type"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="SHAPE_TYPE_UK"> 
     <xs:selector xpath="ALLOWED_SHAPE_TYPES/SHAPE_TYPE"/> 
     <xs:field xpath="."/> 
    </xs:unique> 
    </xs:element> 
    <xs:complexType name="shape-list-type"> 
    <xs:sequence> 
     <xs:element name="SHAPE" minOccurs="0" maxOccurs="unbounded"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="TYPE" type="xs:string"> 
       <xs:keyref name="SHAPE_TYPE_FK" refer="SHAPE_TYPE_UK"> 
       <xs:selector xpath="."></xs:selector> 
       <xs:field xpath="."></xs:field> 
       </xs:keyref> 
      </xs:element> 
      <xs:element name="SUB_SHAPES" type="shape-list-type"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

当氧气13.2验证我得到以下错误:

System ID: C:\pvcswork\CodeSource\XMLSchema\KEYREF_DATA.xml 
Main validation file: C:\pvcswork\CodeSource\XMLSchema\KEYREF_DATA.xml 
Schema: C:\pvcswork\CodeSource\XMLSchema\KEYREF_TEST.xsd 
Engine name: Xerces 
Severity: error 
Description: Identity Constraint error: identity constraint "[email protected]" has a keyref which refers to a key or unique that is out of scope. 
Start location: 10:28 

我相信这是由于xs:keyref是xs:complexType定义的子元素,它不是定义xs:unique的xs:元素的子元素。

我可以将xs:keyref移动到ROOT定义中,并使用XPath定位TYPE元素,但//语法不被允许,因此我将失去递归并必须为每个级别定义一个新的xs:keyref的嵌套。 **更新 - //在XPath开始时允许,前面有一个点! **

有没有我错过的解决方案(仍在使用XSD)?在此先感谢..

下面的XSD将是我对您的问题的解决方案。我基本上修复了一些选择器,并将它们放在同一水平。

QTAssistant showing unique/keyref

的XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="ROOT"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="ALLOWED_SHAPE_TYPES"> 
        <xs:complexType> 
         <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
          <xs:element name="SHAPE_TYPE" type="xs:string"/> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
       <xs:element name="SHAPES" type="shape-list-type"/> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:unique name="SHAPE_TYPE_UK"> 
      <xs:selector xpath="ALLOWED_SHAPE_TYPES/SHAPE_TYPE"/> 
      <xs:field xpath="."/> 
     </xs:unique> 
     <xs:keyref name="SHAPE_TYPE_FK" refer="SHAPE_TYPE_UK"> 
      <xs:selector xpath=".//SHAPE/TYPE"></xs:selector> 
      <xs:field xpath="."></xs:field> 
     </xs:keyref>   
    </xs:element> 
    <xs:complexType name="shape-list-type"> 
     <xs:sequence> 
      <xs:element name="SHAPE" minOccurs="0" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="TYPE" type="xs:string"/> 
         <xs:element name="SUB_SHAPES" type="shape-list-type"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 
+0

谢谢,我真的以为我已经试过了,manged说服自己, '//' 未在XSD不允许的。这个溶胶虽然有效。 – Arth 2012-08-06 06:49:49

+0

结果'//'被允许,但仅限于XPath的开头,并且以'。'开头。 – Arth 2012-08-06 06:53:42