【问题标题】:XSD Validation XML has an Attribute trueXSD 验证 XML 有一个属性 true
【发布时间】:2012-06-01 06:14:39
【问题描述】:

我的问题是,如果我必须使用 xml 验证是否只有一个属性为真,并且其中一个必须为真:

<addresses>
    <address>
        <primary>true</primary>
        <street>One str.</street>
        <number>111</number>
    </address>
    <address>
        <primary>false</primary>
        <street>Two str.</street>
        <number>222</number>
    </address>
</addresses>

怎么办??

ps:对不起我的英语。

【问题讨论】:

    标签: xml validation xsd xml-validation xsd-validation


    【解决方案1】:

    执行此操作的最简单方法(或者在我看来是这样!其他人可能不同意)是使用稍微不同的 XML 结构。您需要一个主地址和零个或多个非主地址。如果您对具有不同要求的事物使用不同的名称,那么任何 XML 验证方法(DTD、XSD 等)都可以很容易地说出来。如果XML结构变成

    <addresses>
      <primary-address>
        <street>One str.</street>
        <number>111</number>
      </primary-address>
      <address>
        <street>Two str.</street>
        <number>222</number>
      </address>
    </addresses>
    

    然后很容易编写一个 XSD 架构,将 addresses 限制为只包含一个主地址,并明确捕获主地址和其他地址具有相同结构的事实:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      elementFormDefault="qualified"> 
    
      <xsd:complexType name="address">
        <xsd:sequence>
          <xsd:element ref="street"/>
          <xsd:element ref="number"/>
        </xsd:sequence>
      </xsd:complexType>
    
      <xsd:element name="primary-address" type="address"/>  
      <xsd:element name="address" type="address"/>  
      <xsd:element name="addresses">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element ref="primary-address"/>
            <xsd:element ref="address" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
        </xsd:complexType>
      </xsd:element>
    
      <xsd:complexType name="mixed" mixed="true">
        <xsd:sequence/>
      </xsd:complexType>
    
      <xsd:element name="street" type="mixed"/>
      <xsd:element name="number" type="mixed"/>
    </xsd:schema>
    

    如果您不能更改您的 XML 结构,或者不想更改,您可以切换到 XSD 1.1 并使用断言来强制执行约束,或者您可以使用 Schematron 来执行此操作。

    或者(这是一个有点肮脏的技巧),你可以说(1)primary 属性的唯一合法值是true,(2)该属性在address 元素上是可选的, (3) primary 属性的每次出现都必须具有唯一值。

    但我真的建议更改 XML 结构。

    【讨论】:

    • (3​​) 每次出现的主要属性都必须具有唯一值。 当您有多个非主要地址时,这将不起作用,因为它们的 primary 属性都将是错误的,因此不是唯一的。
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多