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

时间:2016-04-01 17:36:35

标签: xml xsd xsd-validation xml-validation schema-design

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

你会怎么用?

2 个答案:

答案 0 :(得分:1)

您可以通过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>

答案 1 :(得分:1)

事实上,全局属性很少使用。这样做的一个原因是它们必然位于定义模式文档的目标名称空间中,这通常不是您想要的。如果您拥有许多元素共有的属性,那么一种流行的替代方法是定义全局attributeSet(即使它只包含一个属性),因为这些属性可以不在命名空间中。