2010-06-15 77 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> 

我不会太担心性能。对于全局类型的引用只会在模式加载时解析一次。

相关问题