当前位置: 首页 > 知识库问答 >
问题:

XSD“包含或”

应瀚
2023-03-14

我需要一个关于xml验证问题的建议。我的问题是我需要为XML验证设置一个XSD,它定义了两个强制字段和两个可选字段。根据可用数据,字段切换的特征。

如果满足上述任一情况,则XML应有效。

  1. 应能够填写AAA和BBB字段。填写这些字段后,CCC和DDD可能为emtpy

我正在考虑像下面这样的结构,但我无法用我的ALTOVA XMLSPY 2012保存它。它说内容模型不是唯一的。

<xs:complexType name="ZZZType">
  <xs:annotation>
    <xs:documentation>Selection</xs:documentation>
  </xs:annotation>
  <xs:sequence>
    <xs:element name="XXX" type="xs:string" nillable="true" minOccurs="0"/>
    <xs:choice>
      <xs:sequence>
        <xs:element name="AAA" type="AAAType" nillable="false"/>
        <xs:element name="BBB" type="BBBType" nillable="false"/>
        <xs:element name="CCC" type="CCCType" nillable="false" minOccurs="0"/>
        <xs:element name="DDD" type="DDDType" nillable="false" minOccurs="0"/>
      </xs:sequence>
      <xs:sequence>
        <xs:element name="AAA" type="AAAType" nillable="false" minOccurs="0"/>
        <xs:element name="BBB" type="BBBType" nillable="false" minOccurs="0"/>
        <xs:element name="CCC" type="CCCType" nillable="false"/>
        <xs:element name="DDD" type="DDDType" nillable="false"/>
      </xs:sequence>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

有没有办法实现我想做的事?

共有1个答案

龚博涛
2023-03-14

<罢工> 不使用XML模式 。更正:不适用于XML Schema 1.0(感谢@PetruGardea的观察)。使用XSD 1.0,您可以限制复杂类型的结构和简单类型的内容,但无法根据其他类型的内容限制类型。

要使用XSD 1.0做到这一点,您需要另一层验证,您可以使用编程语言来实现,或者您可以使用Schematron之类的东西,这是一个非常流行的解决方案。您可以下载ISO标准并从官方网站上找到很多示例和教程。如果您了解XPath和XSLT,您可能会发现它很容易使用。

XML模式1.1支持用XPath 2.0编写的断言(包括if/else、循环以及XPath 1.0已有的所有内容)。您可能可以添加到您的<代码>

<xs:assert test="(AAA and BBB or CCC or DDD) or (CCC and DDD or AAA or BBB)" />

(我没有测试——我会尽快更新这篇文章,或者在此期间有人可能会发布更好的答案)。

 类似资料:
  • 我有一个XSD文件,我想在其中放置几个图表,以及服务的描述。添加时 我得到错误:“多个根标记” 如果我这样写: 我得到错误: 发现以元素{开头的内容无效http://www.w3.org/2001/XMLSchema“:架构}。其中一个{”http://www.w3.org/2001/XMLSchema“:simpleType,”http://www.w3.org/2001/XMLSchema“:

  • 我试图根据内部引用另一个XSD的XSD验证XML(使用include语句)。 作为, 现在,当根据xsd(Schema1.xsd)验证我的XML时,如下所示: 我得到一个错误,“cvc-datatype-valid.1.2.1:'true'不是'boolean'的有效值。” 这是针对schema1.xsd引用的schema2.xsd中定义的元素。 如果我做错了什么,请告诉我。

  • 问题:“main.xsd”是一个有效的xml模式文档吗? 当使用解析器(或从python库(该库反过来使用xmllint)进行验证时,我会得到以下错误: 元素“{http://www.w3.org/2001/xmlschema}Element”,属性“ref”:不允许从该架构引用命名空间“http://imported”中的组件,因为没有由import语句指示。WXS架构main.xsd编译失败

  • 我的真实案例使用了大量具有大量属性的类,版本控制的数量可能是一个很大的数字。我希望存储每个版本的XSD,并通过动态指定包含版本号的XSD名称从Java类生成XMLs。 有没有可能实现我上面描述的需求,或者你有一个类似的解决方案来满足我的需求?

  • 正在寻找旧JSF页面的解决方案。我试图使用contains方法根据另一列是否包含单词red box来呈现组合框。 这一个工作和组合框被禁用。 但是,我也想在值不包含红色框时渲染它们,但随后将启用combox。 这是行不通的。 因此,我如何测试的任何想法都不包含特定的单词。我还尝试了choose test when,但由于第一个表。col4值只是一个空字符串。 有什么想法吗?谢谢。

  • 我有两个XSD,其中一个XSD包含一个元素,该元素可以包含第二个XSD中的元素。基本上,XSD1有一个元素“etta”,它可以包含XSD2中的任何元素。 我使用xjc生成类,当它被反序列化时,元元素将XSD2中的元素作为JAXBElements包含,而不是XSD2中生成的实际类。我在我的程序中包含了这两组类,包信息是正确的。 这就是我定义XSD的方式。我想问题在于我的“任何”元素。 因此,基本上我