【问题标题】:Restrict type of xsd:any to xsd:string only?仅将 xsd:any 的类型限制为 xsd:string?
【发布时间】:2015-04-29 01:45:40
【问题描述】:

所以我正在编写一个新的 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,除了它是所有问题的答案吗?基本上是从帽子里挑出来的。)

【问题讨论】:

  • 你能添加一个可能的数据示例吗?
  • @FlorianSchmidinger 给我一分钟,我会举一个我可能期望的例子。
  • @FlorianSchmidinger 我添加了一些数据示例,希望对您有所帮助。我的印象是,如果您使用element,则需要提供name 属性。如果我错过了name 属性,我可以传入任何元素名称吗?
  • 我不认为这可以在 XML Schema 1.0 中表示,但是如果您可以使用 1.1,那么您可以在不指定类型的情况下使用 xs:any,然后在complexType 禁止extraInfo 下的孙元素
  • 我也无法做到这一点。我曾经很擅长这个,但那是前一段时间......

标签: xml xsd xsd-validation


【解决方案1】:

XSD 1.1

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

这很自然,因为您希望只允许字符串值。

元素(在 cmets 中更新每个 OP 问题)

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

【讨论】:

  • 这似乎是一个合理的解决方案。我可以限制传入的属性数量吗?所以我可以限制它说最多 42 个属性?
  • 限制属性计数:在 XSD 1.1 中,是的,使用断言;在 XSD 1.0 中,您必须进行带外检查。如果限制用户项目的最大数量真的很重要,您可以考虑使用带有用户定义的@name@value 属性的item 元素。然后您可以轻松限制items 的最大数量。用示例更新答案。
  • 我认为你的答案是我能得到的最接近的答案,而不会更改为XML Schema 1.1,所以我会接受。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多