【问题标题】:how to set conditions in a complex type present in xsd如何在 xsd 中存在的复杂类型中设置条件
【发布时间】:2015-10-15 21:12:30
【问题描述】:

我有一个如下所示的xml架构。这里我想实现两个复杂类型的条件,如下所示

  1. ParcelNumberCoordinates 应该存在
  2. 如果存在WorkArea,那么Coordinates 应该是强制性的

在下面的架构中如何实现这两个条件

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xsi="http://www.w3.org/2007/XMLSchema-instance"
           xmlns:xs="http://www.w3.org/2007/XMLSchema"
           attributeFormDefault="unqualified"
           elementFormDefault="qualified"
           xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">

                                    <xs:sequence>
                                      <xs:element name="WorkLocationCommunityName" type="xs:string" />
                                    </xs:sequence>
                                  </xs:complexType>
                                </xs:element>
                              </xs:sequence>
                            </xs:complexType>

                </xs:complexType>

【问题讨论】:

    标签: c# asp.net .net xml xsd


    【解决方案1】:
    1. XSD 1.0 不能代表这个约束; XSD 1.1 可以使用断言。

      如果您的意思是其中一个或两个(正则 OR):

      <xs:assert test="ParcelNumber or WorkArea/WorkLocationCoordinates"/>
      

      如果你的意思是其中之一但不是两者(异或):

      <xs:assert test="    (ParcelNumber and not(WorkArea/WorkLocationCoordinates)) 
                        or (not(ParcelNumber) and WorkArea/WorkLocationCoordinates)"/>
      

      在结束 xs:sequence 标记之后放置适当的断言,但仍然在其内容被约束的元素的 xs:complexType 内(在本例中为 WorkLocation)。

    2. 您的 XSD 已经代表了这一点,因为 Coordinates 的默认 minOccurs1 并且是 WorkArea 的子级,因此当 WorkArea 存在时,将需​​要 Coordinates。 [请注意,您有两个级别的 WorkArea -- 看起来像是一个错误。]

    【讨论】:

    • 其实我不知道你用的是XSD 1.0还是1.1,因为你没有说。我的回答旨在帮助您了解任一版本的可能性。支持的结构各不相同——特别是xs:assert 需要 XSD 1.1。要使用 XSD 1.1,您的处理器必须支持它,并且根据您使用的处理器,您可能必须明确配置它以使用 XSD 1.1。
    • 自动生成 XSD 对入门很有用,但在表达您可能希望对 XML 实例施加的完整约束集(而不是用于生成 XSD 的实例)时,它具有固有的局限性。另请注意,我指的不是您用来生成 XSD 的工具,而是您用来验证 使用XSD 的XML 文档的工具。这个验证 XML 解析器必须支持所用结构所需的 XSD 版本(即xs:assert 需要 XSD 1.1)。
    • 我已经说过在哪里放置断言:在结束 xs:sequence 标记之后放置适当的断言,但仍然在内容被约束的元素的 xs:complexType 内(WorkLocation,在这种情况)。 然而,除非您的处理器支持,否则您将无法使用 XSD 1.1,而且您还没有说明您使用什么处理器来验证 XML。 Microsoft 产品不支持 XSD 1.1; Xerces、Saxon、Altova 等都可以。
    • 您的基本问题似乎超出了一个问题的范围内所能解决的范围。您可能希望将您的问题分解为多个其他问题。我希望我在这里为您提供了有价值的信息,并祝您项目顺利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多