如何在同一父标记下重用本地定义的元素

时间:2013-01-02 05:53:13

标签: xml xsd xml-namespaces xsd-validation

为什么'ref'在这种情况下不起作用:

<xs:complexType name="Team">
    <xs:sequence>
        <xs:element name="Name" type="xs:string"/>
        <xs:element name="Size">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:totalDigits value="1"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element ref="Size"/>
    </xs:sequence>
</xs:complexType>

元素Size有本地范围,不能在本地重用吗?

编辑:上面的情况可能没有多大意义。考虑下面的案例,是否有办法重用现有的“大小”定义:

<xs:complexType name="Team">
    <xs:sequence>
        <xs:element name="Name" type="xs:string"/>
        <xs:element name="Size">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:totalDigits value="1"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="teamLeads">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="Size"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

2 个答案:

答案 0 :(得分:3)

您只能参考顶级元素。

  

{term}(顶级)元素声明·由ref [attribute]的实际值解析。

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#declare-element(参见方框最后一部分)

答案 1 :(得分:1)

Why Does not 'ref' work in this case

因为您尝试两次定义相同的元素。即使你不使用ref但是名字也会出错!

就像这样两次声明元素一样好:

示例:

<xs:complexType name="Team">
    <xs:sequence>
        <xs:element name="Name" type="xs:string"/>
        <xs:element name="Size">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:totalDigits value="1" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
        <xs:element name="Size">
            <xs:simpleType>
                <xs:restriction base="xs:integer">
                    <xs:totalDigits value="1" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
     </xs:sequence>
  </xs:complexType>

ComplexType不能多次定义具有相同或不同类型的同名元素。 Warning : Elements with the same name and in the same scope must have the same type.

这可能是你得到错误的原因..消息可能不清楚,但原因是一样的。

编辑:在这种情况下,我们使用maxOccurs来完成工作!
如果你想使用ref,那么相应的元素应该在不同的XSD(通过命名空间导入)或至少是当前的ComplexType

之外

使用相同的名称,不同层次结构中可以有多个元素!不同类型 !! XSD允许这个!它必须允许!
当你使用带有这个名字的ref时,它应该考虑哪个元素?它将成为一个模棱两可的定义!不是吗?
这就是原因,XSD不允许非全局元素作为参考。虽然您当前的代码没有多个具有相同名称的元素,但它可以拥有< / strong> ..

这是不同层次的不同类型的多个元素的示例:

<xs:complexType>
  <xs:sequence>
    <xs:element name="Name" type="xs:string"/>
    <xs:element name="Size">
      <xs:simpleType>
        <xs:restriction base="xs:integer">
          <xs:totalDigits value="1" />
        </xs:restriction>
      </xs:simpleType>
    </xs:element>
    <xs:element name="something">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="Size" type="xs:string"/>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    <!--<xs:element ref="Size" />-->
  </xs:sequence>
</xs:complexType>