首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于另一个元素值的枚举限制

基于另一个元素值的枚举限制
EN

Stack Overflow用户
提问于 2013-03-09 19:53:11
回答 1查看 1.6K关注 0票数 0

我对XML模式还不熟悉,我正试图找出如何根据另一个值设置限制。

例如:

" state“= RI

无论状态如何,下面的xml模式都允许ABS和Y:

代码语言:javascript
复制
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

  <xs:element name="State"> 
    <xs:simpleType> 
      <xs:restriction base="xs:string"> 
        <xs:enumeration value="RI"/> 
        <xs:enumeration value="CT"/> 
        <xs:enumeration value="NC"/> 
      </xs:restriction> 
    </xs:simpleType> 
  </xs:element> 

  <xs:element name="PersonalInfo"> 
    <xs:complexType> 
      <xs:sequence> 
        <xs:element ref="State"/> 
        <xs:element ref="Car"/> 
      </xs:sequence> 
    </xs:complexType> 
  </xs:element> 

  <xs:element name="Manufacturer"> 
    <xs:simpleType> 
      <xs:restriction base="xs:string"> 
        <xs:enumeration value="MINI"/> 
      </xs:restriction> 
    </xs:simpleType> 
  </xs:element> 

  <xs:element name="Car"> 
    <xs:complexType> 
      <xs:sequence> 
        <xs:element ref="Manufacturer"/> 
        <xs:element ref="AntiLockBrakes"/> 
      </xs:sequence> 
    </xs:complexType> 
  </xs:element> 

  <xs:element name="AntiLockBrakes"> 
     <xs:simpleType> 
       <xs:restriction base="xs:string"> 
         <xs:enumeration value="ABS"/> 
         <xs:enumeration value="Y"/> 
       </xs:restriction> 
     </xs:simpleType> 
   </xs:element> 

 </xs:schema>
EN

回答 1

Stack Overflow用户

发布于 2013-03-09 23:47:57

因为这类约束控制的不是单独涉及的单独元素的值,而是特定值的共存,因此它们通常被称为共现约束(或更简洁的共约束)。

上下文无关的语法(以及模式语言,这些语言本质上提供了专门的词汇表,用于为XML文档编写上下文无关的语法--比如DTD、Relax NG和XSD内容模型)在一般情况下并不能很好地处理共同约束(尽管它们通常可以轻松地处理一些特殊情况)。

基于谓词的约束语言(如Schematron和XSD 1.1中的断言)通常能够方便地表示协同约束,因为它们是围绕谓词(对文档、元素或属性来说是正确的或不成立的东西)的概念构建的,并且通常允许使用布尔运算符组合谓词。

因此,执行您所描述的约束的最佳选择是使用Schematron或XSD1.1中的断言。在XSD1.1中(与Schematron不同),断言不允许在附加断言类型的元素之外查看,因此您需要将断言放在包含State和AntiLockBrakes元素的最小元素上;如果我读取的模式正确,那就是PersonalInfo。XSD1.1模式可以使用断言来执行约束,方法是将PersonalInfo的声明更改为如下所示:

代码语言:javascript
复制
<xs:element name="PersonalInfo"> 
  <xs:complexType> 
    <xs:sequence> 
      <xs:element ref="State"/> 
      <xs:element ref="Car"/> 
    </xs:sequence> 
    <xs:assert test="
      (State = 'RI' and Car/AntiLockBrakes = 'Y')
      or 
      (State = ('NC', 'CT') and Car/AntiLockBrakes = 'ABS')
      "/>
  </xs:complexType> 
</xs:element>

xs: assertion 'test‘属性中的断言是使用XPath 2.0表示的;正如您可能预期的那样,可以使用多种方法来表示它。

Schematron的工作方式类似,但是Schematron本身并没有指定用来表示测试的语言;很容易找到支持用XPath 1.0编写的断言或接受XPath 2.0的Schematron实现。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15315192

复制
相关文章

相似问题

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