【问题标题】:XSD element with both attributes and child elements具有属性和子元素的 XSD 元素
【发布时间】:2023-03-23 07:30:01
【问题描述】:

我想知道定义包含属性和子元素的元素的正确语法(如果可能的话)。例如:

<component type="A" binding="B">
  <operation name="X">
    <input type="C" />
  </operation>

  <event name="Y">
    <output type="D" />
  </event>
</component>

如您所见,组件、操作和事件都具有属性和子元素。是否可以在 XSD 中定义它?怎么样?

非常感谢!

【问题讨论】:

    标签: attributes xsd


    【解决方案1】:

    我在下面给出一个可行的解决方案:

    <xs:simpleType name="inputTypeType">
            <xs:restriction base="xs:string" />
    </xs:simpleType>
    
    <xs:complexType name="inputType">
        <xs:attribute name="type" type="inputTypeType"/>            
    </xs:complexType>
    
    <xs:simpleType name="operationNameType">
            <xs:restriction base="xs:string" />
    </xs:simpleType>
    
    <xs:complexType name="operationType">
      <xs:sequence>
        <xs:element name="input"   type="inputType" />
      </xs:sequence>
        <xs:attribute name="name" type="operationNameType"/>
    </xs:complexType>
    
    
    
    <xs:simpleType name="outputTypeType">
            <xs:restriction base="xs:string" />
    </xs:simpleType>
    
    <xs:complexType name="outputType">
        <xs:attribute name="type" type="outputTypeType"/>           
    </xs:complexType>
    
    <xs:simpleType name="eventNameType">
            <xs:restriction base="xs:string" />
    </xs:simpleType>
    
    <xs:complexType name="eventType">
      <xs:sequence>
        <xs:element name="output"   type="outputType" />
      </xs:sequence>
        <xs:attribute name="name" type="eventNameType"/>
    </xs:complexType>   
    
    
    <xs:simpleType name="typeType">
            <xs:restriction base="xs:string" />
    </xs:simpleType>
    
    <xs:simpleType name="bindingType">
            <xs:restriction base="xs:string" />
    </xs:simpleType>
    
    
    
    
    <xs:complexType name="componentType">
        <xs:sequence>        
            <xs:element name="operation"   type="operationType" />
            <xs:element name="event" type="eventType" />
        </xs:sequence>
        <xs:attribute name="type" type="typeType"/>
        <xs:attribute name="binding" type="bindingType"/>       
    </xs:complexType>
    
    
    <xs:element name="component" type="componentType" />
    

    【讨论】:

      【解决方案2】:

      这是定义与您的 XML 匹配的 XSD 的一种可能方式;在学习 XSD 时,您可以注册一个为您推断 XSD 的工具的帮助,从一个或多个 XML 示例文件开始。

      <?xml version="1.0" encoding="utf-8"?>
      <!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
      <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <xsd:element name="component">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="operation">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="input">
                      <xsd:complexType>
                        <xsd:attribute name="type" type="xsd:string" use="required" />
                      </xsd:complexType>
                    </xsd:element>
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
              <xsd:element name="event">
                <xsd:complexType>
                  <xsd:sequence>
                    <xsd:element name="output">
                      <xsd:complexType>
                        <xsd:attribute name="type" type="xsd:string" use="required" />
                      </xsd:complexType>
                    </xsd:element>
                  </xsd:sequence>
                  <xsd:attribute name="name" type="xsd:string" use="required" />
                </xsd:complexType>
              </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="type" type="xsd:string" use="required" />
            <xsd:attribute name="binding" type="xsd:string" use="required" />
          </xsd:complexType>
        </xsd:element>
      </xsd:schema>
      

      在您逐步​​完成此操作时,您可能会开始调整 min/maxOccurs、使用(必需/可选)、重用定义等。生成的 XSD 是一个很好的起点,但通常最终会以一种或另一种方式进行编辑...

      【讨论】:

      • 我认为xsd:sequence必须在xsd:attributes之前。
      • 是的,这与您所期望的完全相反,因为在实际的 xml 中,属性位于元素之前。
      • XML Schema 设计者的错误设计决定使得 XSD 更难阅读,除了反直觉。应该允许在 complexType 中以任何顺序放置属性和序列等
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2011-12-23
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多