所以我正在写一个新的XSD,我遇到了一个小问题。现在我承认我不是最好的,但我会想到我所做的应该有效,但事实并非如此。
我所追求的是我有一个名为extraInfo
的元素,这个元素最多可以包含42个具有任何名称但只有字符串类型的子元素。这就是我所拥有的:
<xsd:element name="extraInfo" minOccurs="0" maxOccurs="1">
<xsd:annotation>
<xsd:documentation></xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="42" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
我原以为只要我传入类型为xsd:string
它就应该只在这些元素中接受这种类型,但元素名称可以任意命名。但是,我在
type
属性下收到错误
s4s-att-not-allowed:属性'type'不能出现在元素'any'中。
我怎样才能得到它所以我可以传入42个未知名称的元素但是将它们作为字符串类型?
修改
所以基本上我们可能有一个客户传递给我们以下
<extraInfo>
<logoUrl>http://www.google.com/logo.png</logoUrl>
<cssUrl>http://www.google.com/main.css</cssUrl>
</extraInfo>
但是另一位客户传递给我们
<extraInfo>
<headerText>Hello World</headerText>
<footerText>Goodbye World</footerText>
</extraInfo>
我们无法保证调用元素名称。我们可以保证的是类型和字符串,我们将允许传递最多42个元素。(没有理由42除了它的答案一切正确吗?基本上从帽子中挑选出来。)
答案 0 :(得分:2)
请参阅@IanRoberts关于断言extraInfo
子女下不存在孙子元素的评论中的精细建议。
如果您想要更好地控制extraInfo
子元素的类型,您必须先验地指定其名称。
<强>属性强>
或者,为什么不利用属性值已经被限制为不具有子元素并使用xsd:anyAttribute
代替的事实:
<xsd:element name="extraInfo">
<xsd:complexType>
<xsd:anyAttribute processContents="skip" />
</xsd:complexType>
</xsd:element>
然后,用户可以在这些行中添加extraInfo
:
<extraInfo
logoUrl="http://www.google.com/logo.png"
cssUrl="http://www.google.com/main.css"/>
和
<extraInfo
headerText="Hello World"
footerText="Goodbye World"/>
如果您希望仅允许字符串值,那将是很自然的。
元素(评论中每个OP问题更新)
如果42个约束的最大值对你很重要,你可以使用
这样的结构进行meta<extraInfo>
<item name="logoUrl" value="http://www.google.com/logo.png"/>
<item name="cssUrl" value="http://www.google.com/main.css"/>
</extraInfo>
然后,您可以通过item
在XSD 1.0中轻松限制@maxOccurs
个元素的数量。