我想创建一个模式,需要在给定元素内:
上述限制应适用于多个子元素,我只想声明此限制一次(即:DRY)
实际上,这实际上是为子元素提供翻译,例如在下面的示例中,
title
和 firstline
元素都应该至少出现一次,但对于每种给定语言仅出现一次:
<book>
<title lang="en">The Hobbit</title>
<title lang="de">Der kleine Hobbit</title>
<firstline lang="en">In a hole in the ground there lived a hobbit.</firstline>
<firstline lang="fr">Dans un trou vivait un hobbit</firstline>
</book>
然而这应该是非法的,因为
<title lang="en">
元素是重复的:
<book>
<title lang="en">The Hobbit</title>
<title lang="en">The Hobbit or There and Back Again</title>
<firstline lang="en">In a hole in the ground there lived a hobbit.</firstline>
</book>
我知道我可以创建一个使用
unique
约束的模式,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" minOccurs="1" maxOccurs="unbounded">
<xs:complexType mixed="true">
<xs:attribute name="lang" use="required" type="xs:language"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="eachLangAtMostOnce">
<xs:selector xpath="title"/>
<xs:field xpath="@lang"/>
</xs:unique>
</xs:element>
</xs:schema>
这适用于
title
元素,但我需要复制 firstline
元素的代码。它还将强制唯一性的逻辑放入包含元素中 (book
)。
是否可以创建一个可重复使用的类型来实现我想要的功能?
在 XSD 1.1 中,您可以通过断言来做到这一点:
<xs:assert test="count(distinct-values(*/concat(local-name(),@lang))) = count(*)"/>