我可以指定只有一个子元素具有的XMLSchema一定的独特属性?

问题描述:

是否可以指定HTML的<option selected>的XSD等效 - 正是只有一个元素都有一个特定的属性?我可以指定只有一个子元素具有的XMLSchema一定的独特属性?

例如,假设下面的示例XML片段:

<foo-list> 
    <foo/> 
    <foo bar="bar"/> 
    <foo/> 
</foo-list> 

我可以写出如下XSD,以确保只有一个foo@bar

<xs:element name="foo-list"> 
    <!-- FOO-LIST contains [1..n] FOO elements --> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element ref="foo" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 
    <!-- any FOO with @BAR must have unique @BAR --> 
    <xs:unique name="oneFooBar"> 
    <xs:selector xpath="foo"/> 
    <xs:field xpath="@bar"/> 
    </xs:unique> 
</xs:element> 
<xs:element name="foo"> 
    <xs:complexType> 
    <!-- FOO has optional @BAR --> 
    <xs:attribute name="bar"> 
     <xs:simpleType> 
     <!-- @BAR must = "bar", if specified --> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="bar"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 
    </xs:complexType> 
</xs:element> 

假设一切的适当资格,而且我使用的纸牌enumeration代替pattern的决定是合理的:

1)这个模式是否合理地表示我的意图? (即,有在<foo-list>零个或一个<foo bar="bar"/>和零个或多个<foo/>

2)是存在于要求有恰好一个<foo bar="bar"/>的方法吗?

1)是的,确实如此,在一个“怪异”的解决方法十岁上下的方式。

2)不与股票XSD 1.0。扔在Schematron中,你就全都准备好了。或者使用断言转移到XSD 1.1(这可以让您确切地了解Schematron为您所需做的事情)。事情是,既然你没有指定目标平台,XSD 1.1的实现很难实现(Java在Xerces中有一个免费的选项,并且在Saxon EE中支付),但是其他的如.NET没有任何空闲。 Schematron“编译器”实际上仅仅是将模式转换为XSLT的转换;它可以是1.0或2.0,这意味着它可以被用于在几乎任何(合理)平台增强正常XSD 1.0。

+0

是否有可能为你的“怪异”的解决方法 - ishness详细点吗?如果有这样的标准模式,我会很乐意让它更简单,更“正常”。 –

+1

@MattyK,遗憾的是没有“直接”或者优雅的方式来准确地说出你想要的1)。这就是为什么“解决方法”的原因。我的意思是“怪异”作为赞美:通过将值域限定为唯一值来强制执行“至多一个”是一种有趣的方式,因此使用唯一而不是关键约束。例如,在属性接受true/false的情况下,它不起作用。 –