微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

具有单一名称和不同类型的 XSD 多个元素

如何解决具有单一名称和不同类型的 XSD 多个元素

我对 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。

非常感谢您的帮助!

解决方法

您可以定义带有限制的 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>
,

如果您扩展 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>

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

,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。