首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >其简单类型由属性驱动的元素的XML模式

其简单类型由属性驱动的元素的XML模式
EN

Stack Overflow用户
提问于 2015-11-12 06:18:28
回答 1查看 463关注 0票数 2

我想为包含选项的文档编写XML模式(xsd 1.1)。每个选项都有一个名称和一个类型(例如布尔值、整数、字符串等)。和那种类型的数据相匹配。类型列表是固定的,但是很长。(为了简单起见,清单3中只列出了3条。)

我该如何做到这一点而不用重复那么多可笑的事情呢?

用例1

以下是此架构的有效文档。

清单1:

代码语言:javascript
复制
<abc:options>
  <abc:option name="is-enabled" type="boolean">false</abc:option>
  <abc:option name="wing-span"  type="float">1.2</abc:option>
</abc:options>

用例2

此文档对此架构无效,因为@type属性的简单类型位错误。

代码语言:javascript
复制
<abc:options>
  <abc:option name="is-enabled" type="boolean">24</abc:option>
  <abc:option name="wing-span"  type="float">this-is-not-a-number!</abc:option>
</abc:options>

到目前为止我尝试过的..。

清单3是我迄今为止的尝试。但是这很糟糕,因为我必须为每种数据类型重新声明@name属性。有没有更好的解决办法?也就是说,我不必为每种可能的数据类型重新声明@name属性。

清单3:

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:abc="http://www.example.com"
           targetNamespace="http://www.example.com"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">

  <xs:element name="options">
    <xs:complexType>
      <xs:sequence minOccurs="1" maxOccurs="unbounded">
        <xs:element name="abc:option" type="option-Type"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name="option-Datum-Type">
    <xs:restriction base="xs:string">
      <xs:enumeration value="boolean"/>
      <xs:enumeration value="integer"/>
      <xs:enumeration value="float"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:complexType name="option-Type-boolean">
    <xs:simpleContent>
      <xs:extension base="xs:boolean">
        <xs:attribute name="name" type="xs:token" use="required" />
        <xs:attribute name="type" type="abc:option-Datum-Type" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="option-Type-string">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="name" type="xs:token" use="required" />
        <xs:attribute name="type" type="abc:option-Datum-Type" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="option-Type-float">
    <xs:simpleContent>
      <xs:extension base="xs:double">
        <xs:attribute name="name" type="xs:token" use="required" />
        <xs:attribute name="type" type="abc:option-Datum-Type" use="required" />
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="option-Type">
    <xs:alternative test="@type='boolean'"  type="abc:option-Type-boolean"/>
    <xs:alternative test="@type='string'"   type="abc:option-Type-string" />
    <xs:alternative test="@type='float'"    type="abc:option-Type-float"  />
    <xs:alternative type="xs:error"/>
  </xs:complexType>

</xs:schema>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-21 20:27:48

如果该类型只能是原子类型之一,则可以使用如下所示的xs:assert

代码语言:javascript
复制
<xs:complexType name="option-Type">
    <xs:simpleContent>
        <xs:extension base="xs:string">
            <xs:attribute name="name" type="xs:token" use="required" />
            <xs:attribute name="type" type="xs:string" use="required" />
            <xs:assert
                test="if (@type='boolean')  then . castable as xs:boolean
                else if (@type='float')     then . castable as xs:float
                else if (@type='int')       then . castable as xs:int
                else if (@type='string')    then . castable as xs:string
                else false()"/>
        </xs:extension>
    </xs:simpleContent>
</xs:complexType>

备注:

  • 您不需要声明任何新类型。如果需要,甚至还可以跳过枚举的声明。
  • 使用这种方法,您需要为每一个新的可能类型创建一个新行(您并不真正需要一个新的行,但是对于不同行中的每一个类型都很容易阅读)。
  • 如果您发现text().更清楚的话,可以使用它而不是.
  • 请注意,如果XPath 2.0有一个类似于javascript和其他语言的eval函数,那么这种方法是多么简单: 我本来想要在XPath 3.0规范中添加一个eval/parse函数,但我认为它最终还没有被添加。
  • instance of不同,除了?castable as运算符之外,您不能使用列表(*+)。您只能使用这种方法使用原子类型。
  • 当类型声明为xs:string时,对字符串的强制转换应该总是成功的。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33665445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档