【问题标题】:XSD multiple elements with single name and different typesXSD 具有单一名称和不同类型的多个元素
【发布时间】:2021-09-22 20:04:25
【问题描述】:

我对 XSD 很陌生,但在尝试之前,我遇到了一个对我来说似乎很简单的问题。

我想为以下 XML 编写 XSD:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<properties>

  <double name="Value1">111.111</double>
  <double name="Value2">222.222</double>

</properties>

我希望这个 XSD 非常严格,因此 Value1 和 Value2 是固定的,唯一的“免费”值是 111.111 和 222.222。

我还想强制 Value1 和 Value2 都出现在 XML 文件中(尽管不一定按此顺序)

所以我写了这个 XSD:

<?xml version = "1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="properties">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="double">
               <xs:complexType>
                  <xs:simpleContent>
                     <xs:extension base="xs:decimal">
                        <xs:attribute name="name" type="xs:string" fixed="Value1" use = "required"/>
                     </xs:extension>
                  </xs:simpleContent>
               </xs:complexType>
            </xs:element>
            <xs:element name="double">
               <xs:complexType>
                  <xs:simpleContent>
                     <xs:extension base="xs:decimal">
                        <xs:attribute name="name" type="xs:string" fixed="Value2" use = "required"/>
                     </xs:extension>
                  </xs:simpleContent>
               </xs:complexType>
            </xs:element>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:schema>

不幸的是,我的 XML 验证器出现以下错误:

Multiple Elements With Name 'double', With Different Types, Appear In The Model Group.

我知道这种问题是已知的,但我找不到任何方便的答案,或者我根本不明白!?而且我不能使用 XSD 1.1。

非常感谢您的帮助!

【问题讨论】:

  • 我认为应该可以为两个double 元素定义一个单一类型,将name 属性限制为两个值Value1 和Value2 的单一类型枚举。但是,这并不能确保第一个 double 具有 name="Value1" 和第二个 Value2,您只能将值的唯一性定义为 ID。
  • 您想要恰好有两个double 元素吗?还是更多?如果正好有两个,则在 name 属性上设置一个 ID/唯一性约束,该属性已被限制为 Value1 或 Value2。
  • 是的马丁,这正是我想做的:正好两个双元素。

标签: xml xsd schema


【解决方案1】:

如果您扩展xs:ID 并使用min/maxOccurs="2",则与发布的答案略有不同:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
    <xs:simpleType name="tVal">
        <xs:restriction base="xs:ID">
            <xs:pattern value="Value1|Value2"/>
        </xs:restriction>
    </xs:simpleType>
    
    <xs:element name="properties">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="double" minOccurs="2" maxOccurs="2">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:decimal">
                                <xs:attribute name="name" type="tVal" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    
</xs:schema>

应该实现关于具有Value1 或Value2 的唯一name 属性的要求。

【讨论】:

    【解决方案2】:

    感谢您的回答! 它解决了我最初发布的问题。 但我忘了提到我还想强制 Value1 和 Value2 都出现在 XML 文件中(尽管不一定按这个顺序)。 有可能吗?

    【讨论】:

      【解决方案3】:

      您可以定义一个 xs:simpleType 并带有限制以限制您的 @name 属性的可能值。那么您将只需要一个序列中的doulbe 元素:

      <?xml version = "1.0"?>
      <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
      
          <xs:simpleType name="tVal">
              <xs:restriction base="xs:string">
                  <xs:pattern value="Value1|Value2"/>
              </xs:restriction>
          </xs:simpleType>
          
         <xs:element name="properties">
            <xs:complexType>
               <xs:sequence maxOccurs="unbounded">
                  <xs:element name="double">
                     <xs:complexType>
                        <xs:simpleContent>
                           <xs:extension base="xs:decimal">
                              <xs:attribute name="name" type="tVal" use="required"/>
                           </xs:extension>
                        </xs:simpleContent>
                     </xs:complexType>
                  </xs:element>
               </xs:sequence>
            </xs:complexType>
         </xs:element>
         
      </xs:schema>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多