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

2024-04-10

所以我正在编写一个新的 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 个名称未知的元素,但将它们作为字符串类型?

Edit

所以基本上我们可能会有一个客户向我们传递以下内容

<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

请参阅评论中的 @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"/>

and

<extraInfo
    headerText="Hello World"
    footerText="Goodbye World"/>

鉴于您希望仅允许字符串值,这是很自然的。

Elements(评论中每个OP问题的更新)

如果 42 的最大值约束对您很重要,您可以采用如下结构

<extraInfo>
    <item name="logoUrl" value="http://www.google.com/logo.png"/>
    <item name="cssUrl" value="http://www.google.com/main.css"/>
</extraInfo>

然后你可以限制数量itemXSD 1.0 中的元素很简单,通过@maxOccurs.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 xsd:any 的类型限制为仅 xsd:string? 的相关文章

随机推荐