我们可以将新属性或现有属性的类型更改为“引用元素”吗?

时间:2010-06-15 14:54:09

标签: schema xsd

在我的XML模式中,我有一个元素被其他元素引用了数次,但其属性之一具有不同的枚举值。
现在,我不是在全局空间中创建此元素并在以后引用它,而是在需要的地方创建一个新实例。由于多次重复创建几乎相同的元素,这种方法极大地增加了我的模式大小。它也可能对架构的效率产生不利影响 我看到的唯一方法是创建一次元素然后多次引用它但我的问题是:这个引用元素的一个属性需要为每个引用元素设置一组不同的枚举。
我的问题是:
是否可以在XML Schema中向 “Referenced Element” 添加属性?

这样的事情:

<?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中更改 “Referenced Element” 的现有属性类型吗?
像这样的东西:

<?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>

1 个答案:

答案 0 :(得分: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>

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