2012-02-23 71 views
3
<Metamodel> 
    <Package Name="serhat"> 
    <OwnedType> 
     <Class Name="serhat"></Class> 
    </OwnedType> 
    </Package> 
    <Package Name="serhat2"> 
    <OwnedType> 
     <Class Name="serhat"></Class> 
    </OwnedType> 
    </Package> 
    <Class Name="serhat"></Class> 
</Metamodel> 

我對元素有name屬性。這個名稱屬性在Package元素 中必須是唯一的,但是Class元素名稱屬性可能在另一個類元素上重複,例如;如何爲xsd上的屬性定義不同的作用域?

<Package Name="serhat"> 
    <OwnedType> 
     <Class Name="serhat"></Class> 
    </OwnedType> 
    </Package> 
    <Package Name="serhat2"> 
    <OwnedType> 
     <Class Name="serhat"></Class> 
    </OwnedType> 
    </Package> 

我該如何定義這個屬性?

回答

2

我相信你想要的不在屬性中,而是在身份約束中。因此,生成的XSD是這樣的(我假設類下包必須以某種方式重複):

<?xml version="1.0" encoding="utf-8"?> 
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="Metamodel"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element maxOccurs="unbounded" name="Package"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="OwnedType"> 
           <xsd:complexType> 
            <xsd:sequence> 
             <xsd:element ref="Class" maxOccurs="unbounded"/> 
             </xsd:sequence> 
           </xsd:complexType> 
          </xsd:element> 
         </xsd:sequence> 
         <xsd:attribute name="Name" type="xsd:string" use="required"/> 
        </xsd:complexType> 
        <xsd:unique name="ClassNameUniqueInPackage"> 
         <xsd:selector xpath="OwnedType/Class"/> 
         <xsd:field xpath="@Name"/> 
         </xsd:unique> 
       </xsd:element> 
       <xsd:element ref="Class"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
    <xsd:element name="Class"> 
     <xsd:complexType> 
      <xsd:attribute name="Name" type="xsd:string" use="required"/> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

有了這個假設的模型,下面的XML將驗證:

<Metamodel> 
    <Package Name="serhat"> 
     <OwnedType> 
      <Class Name="serhat"></Class> 
      <Class Name="serhat2"></Class> 
     </OwnedType> 
    </Package> 
    <Package Name="serhat2"> 
     <OwnedType> 
      <Class Name="serhat"></Class> 
     </OwnedType> 
    </Package> 
    <Class Name="serhat"></Class> 
</Metamodel> 

但不是這樣的:

<Metamodel> 
    <Package Name="serhat"> 
     <OwnedType> 
      <Class Name="serhat"></Class> 
      <Class Name="serhat"></Class> 
     </OwnedType> 
    </Package> 
    <Package Name="serhat2"> 
     <OwnedType> 
      <Class Name="serhat"></Class> 
     </OwnedType> 
    </Package> 
    <Class Name="serhat"></Class> 
</Metamodel> 

的錯誤是:

Error occurred while loading [], line 5 position 5 
There is a duplicate key sequence 'serhat' for the 'ClassNameUniqueInPackage' key or unique identity constraint. 
+0

相當不錯的解決方案:) – 2012-02-24 03:59:15