验证xml元素的属性值

时间:2011-07-13 12:36:01

标签: attributes xsd elements

我正在尝试编写一个验证以下xml片段的xsd文档。

<parentElement>
    <someElement name="somethingRequired"/>
    <someElement name="somethingElseRequired"/>
    <someElement name="anything"/>
</parentElement>

如果parentElement包含someElement的至少两个,其中一个具有包含值“somethingRequired”的属性名称,另一个具有包含值“somethingElseRequired”的属性名称,则应验证。

这可能吗?

2 个答案:

答案 0 :(得分:2)

  

这可能吗?

这取决于您的限制需要具体的具体程度。如果所有name属性都具有唯一值足够好,那么您可以使用<xs:unique>

来实现此目标
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="parentElement">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="2" maxOccurs="unbounded" name="someElement">
          <xs:complexType>
            <xs:attribute name="name" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniqueName">
      <xs:selector xpath="someElement" />
      <xs:field xpath="@name" />
    </xs:unique>
  </xs:element>
</xs:schema>

您还可以将属性值限制为一些枚举的允许值集,而不是仅使用type="xs:string"。虽然不能仅限制前两个名称属性是唯一的,因为xpath属性不允许包含谓词。

如果你需要first name属性有一些特定值,第二个有一些其他特定值,其余有任何值,那么我会说这违反了Schema Component Constraint Element Declarations Consistent或者需要某种比<xs:unique>更具体的共现约束,所以通常不可能。您可以通过在实例文档中使用xsi:type属性来明确声明元素的类型。

答案 1 :(得分:0)

除了根据属性值进行验证外,您可以做的所有事情都可以。