在 XSD 中全局定义属性的目的

Purpose of defining an attribute globally in XSD

在 XSD 中,可以在架构元素下定义属性,就像我在下面的 XSD 中定义的 someAttr 一样:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com"
           xmlns:xs="http://www.w3.org/2001/XMLSchema" 
           elementFormDefault="qualified" 
           attributeFormDefault="unqualified">
    <xs:element name="Companys">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Company" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="companyname" type="xs:string" default="test1"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:attribute name="someAttr" type="xs:string" default="R"/>
</xs:schema>

你会如何使用它?

您可以通过 xs:attribute/@ref 使用它,这对于允许在多个位置使用 someAttr 的一个定义特别方便。

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.example.com"
           xmlns:e="http://www.example.com"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
  <xs:element name="Companys">
    <xs:annotation>
      <xs:documentation>Comment describing your root element</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Company" maxOccurs="unbounded">
          <xs:complexType>
            <xs:attribute name="companyname" type="xs:string" default="test1"/>
            <xs:attribute ref="e:someAttr"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:attribute name="someAttr" type="xs:string" default="R"/>
</xs:schema>

全局属性其实很少用到。原因之一是它们必须位于定义模式文档的目标名称空间中,而这通常不是您想要的。如果您有许多元素共有的属性,一种流行的替代方法是定义一个全局属性集(即使它只包含一个属性),因为这样属性就可以不在任何命名空间中。