2012-08-03 102 views
1

我有一個在頂部,並允許類型的列表對象和參照允許的類型子對象的遞歸列表類型的一些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)?在此先感謝..

回答

2

下面的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