至少一个在XSD中没有重复的XML元素

Dan*_*dré 5 xml xsd xml-validation

我正在尝试创建一个验证场景,我想从列表中选择至少一个非重复元素.

在某些地方:

<xs:choice minOccurs="1" maxOccurs="7">
    <xs:element name="Sunday"/>
    <xs:element name="Monday"/>
    <xs:element name="Tuesday"/>
    <xs:element name="Wednesday"/>
    <xs:element name="Thursday"/>
    <xs:element name="Friday"/>
    <xs:element name="Saturday"/>
</xs:choice>
Run Code Online (Sandbox Code Playgroud)

但是,上述解决方案允许重复元素出现在列表中,这是我不想要的.

有效 XML的示例:

<Monday/>
<Tuesday/>
<Friday/>
Run Code Online (Sandbox Code Playgroud)

无效 XML的示例:

<Monday/>
<Monday/>
Run Code Online (Sandbox Code Playgroud)

这可以通过XSD实现,而无需对所有可能的序列进行硬编码吗?如果是这样的话?

kjh*_*hes 4

XSD 1.0 解决方案

我不相信您的约束可以在 XSD 1.0 中表达“而无需对所有可能的序列进行硬编码”(但请参阅CM Sperberg-McQueen 的巧妙解决方案,该解决方案大大减少了组合数学)。使用 可以强制元素的值是唯一的xsd:unique,但使用的 XPath 子集xsd:unique不包括name(),否则这可能有助于对元素名称进行唯一性声明。

XSD 1.1 解决方案

您的约束可以在 XSD 1.1 中使用以下方式表示xs:assert

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified"
  vc:minVersion="1.1">
  <xs:element name="Days">
    <xs:complexType>
      <xs:choice minOccurs="1" maxOccurs="7">
        <xs:element name="Sunday"/>
        <xs:element name="Monday"/>
        <xs:element name="Tuesday"/>
        <xs:element name="Wednesday"/>
        <xs:element name="Thursday"/>
        <xs:element name="Friday"/>
        <xs:element name="Saturday"/>
      </xs:choice>
      <xs:assert test="count(*[name() = following-sibling::*/name()]) = 0"/>
    </xs:complexType>
  </xs:element>  
</xs:schema>
Run Code Online (Sandbox Code Playgroud)