仅将 xsd:any 的类型限制为 xsd:string?
Restrict type of xsd:any to xsd:string only?
所以我正在写一个新的 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: Attribute 'type' cannot appear in element '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,除了它是所有问题的答案?基本上是从帽子里挑出来的。)
XSD 1.1
请参阅评论中关于断言 extraInfo
的子元素下不存在任何孙元素的评论中的@IanRoberts 好的建议。
XSD 1.0
如果您想更好地控制 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 问题更新)
如果 max of 42 约束对你很重要,你可以使用
这样的结构
<extraInfo>
<item name="logoUrl" value="http://www.google.com/logo.png"/>
<item name="cssUrl" value="http://www.google.com/main.css"/>
</extraInfo>
然后您可以通过 @maxOccurs
.
在 XSD 1.0 中简单地限制 item
元素的数量
所以我正在写一个新的 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: Attribute 'type' cannot appear in element '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,除了它是所有问题的答案?基本上是从帽子里挑出来的。)
XSD 1.1
请参阅评论中关于断言 extraInfo
的子元素下不存在任何孙元素的评论中的@IanRoberts 好的建议。
XSD 1.0
如果您想更好地控制 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 问题更新)
如果 max of 42 约束对你很重要,你可以使用
这样的结构<extraInfo>
<item name="logoUrl" value="http://www.google.com/logo.png"/>
<item name="cssUrl" value="http://www.google.com/main.css"/>
</extraInfo>
然后您可以通过 @maxOccurs
.
item
元素的数量