我正在尝试编写一个验证以下xml片段的xsd文档。
<parentElement>
<someElement name="somethingRequired"/>
<someElement name="somethingElseRequired"/>
<someElement name="anything"/>
</parentElement>
如果parentElement包含someElement的至少两个,其中一个具有包含值“somethingRequired”的属性名称,另一个具有包含值“somethingElseRequired”的属性名称,则应验证。
这可能吗?
答案 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)
除了根据属性值进行验证外,您可以做的所有事情都可以。