2010-06-15 42 views
1

在我的XML模式中,有一個元素被其他元素引用了幾十次,但是其中一個屬性的枚舉值不同。
現在,我不是在全局空間中創建這個元素,而是稍後引用它,而是在需要的地方創建一個新實例。由於多次重複創建幾乎相同的元素,這種方法極大地增加了我的模式大小。它也可能對模式的效率產生不利影響。
我看到的唯一方法是創建元素一次,然後多次引用它,但我的問題是:此引用元素的一個屬性需要爲每個引用元素都有一組不同的枚舉。
我的問題是:
是否有可能將屬性添加到「引用的元素」在XML模式?我們是否可以添加新屬性或將現有屬性的類型更改爲「引用元素」?

事情是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.myDomain.com" xmlns="http://www.myDomain.com" elementFormDefault="qualified"> 

    <xs:simpleType name="myValues1"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="value1" /> 
     <xs:enumeration value="value2" /> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="myElement"> 
    <xs:complexType mixed="true"> 
     <xs:attribute name="attr1" type="xs:string" /> 
     <xs:attribute name="attr2" type="xs:string" /> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="MainElement1"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="myElement"> 
      <xs:complexType> 
      <xs:attribute name="myAtt" type="myValues1" /> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute name="mainAtt1" /> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

或者,我們可以改變一個「引用的元素」 XML Schema中的現有屬性的類型?
是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.myDomain.com" xmlns="http://www.myDomain.com" elementFormDefault="qualified"> 

    <xs:simpleType name="myValues1"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="value1" /> 
     <xs:enumeration value="value2" /> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="myValues2"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="value3" /> 
     <xs:enumeration value="value4" /> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:element name="myElement"> 
    <xs:complexType mixed="true"> 
     <xs:attribute name="attr1" type="xs:string" /> 
     <xs:attribute name="attr2" type="xs:string" /> 
     <xs:attribute name="myAtt" type="myValues1" /> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="MainElement1"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="myElement"> 
      <xs:complexType> 
      <xs:attribute name="myAtt" type="myValues2" /> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute name="mainAtt1" /> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

回答

0

不能覆蓋引用元素的內容模型。參考點是它每次都指向,正好是

如果你真的想要的元素有不同的內容,你最好定義多個全局複雜類型和使用它們,而不是使用元素參考:

<xs:complexType name="Type1" mixed="true"> 
    <xs:attribute name="attr1" type="xs:string" /> 
    <xs:attribute name="attr2" type="xs:string" /> 
    <xs:attribute name="myAtt" type="myValues1" /> 
</xs:complexType> 

<xs:complexType name="Type2" mixed="true"> 
    <xs:complexContent> 
     <xs:extension base="Type1"> 
     <xs:attribute name="myAtt2" type="myValues2" /> 
     </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="MainElement1"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="myElement" type="Type1"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

我不會太擔心性能。對於全局類型的引用只會在模式加載時解析一次。

相關問題