仅将xsd:any的类型限制为xsd:string?

时间:2015-02-26 15:37:31

标签: xml xsd xsd-validation

所以我正在写一个新的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除了它的答案一切正确吗?基本上从帽子中挑选出来。)

1 个答案:

答案 0 :(得分:2)

XSD 1.1

请参阅@IanRoberts关于断言extraInfo子女下不存在孙子元素的评论中的精细建议。

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问题更新)

如果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个元素的数量。