在XSD中设置树的“任意”部分的模式,而不显式命名元素

时间:2014-11-05 16:34:06

标签: xml xsd

我认为允许任何元素名称作为子元素有效是个好主意。

我想到的是这样的事情

<attributes> 
  <foo> 
    <screenName>Foo thing</screenName>
    <value>1234</value>
  </foo> 
  <bar> 
    <screenName>Bar thing</screenName>
    <value>abcd</value>
  </bar>
</attributes>

有问题的元素(foo和bar)是最终用户可以自由添加的东西的属性。我打算拥有的元素名称是原始属性名称的清理版本。

虽然我希望这些元素的名称是动态的。我仍然希望所有这些都遵循模式(在此示例中:具有必填字段screenName和value)。

据我所知(I had a look at this),XSD中的“任何”事物本质上是一个“黑洞”,你可以毫无限制地扔掉任何东西。

如果我在我的示例中为'foo'和'bar'定义XSD架构,则设置限制的唯一方法。由于可能属性的数量(数千),我不想明确定义所有属性,但我仍然希望有这些限制。

这可以在XSD中定义吗?

1 个答案:

答案 0 :(得分:1)

XSD 1.0

不能直接表达; xsd:any表示任何标记,无法进一步限制。人们必须检查XSD之外的代码。

XSD 1.1

直接通过xsd:assert表达:

<xs:assert test="every $e in * 
                 satisfies (exists($e/screenName) and exists($e/value))"/>