2016-04-20 36 views
1

我有一个XSD 1.0序列,它定义了一组元素,其中一些元素可以是可选的,但其中没有一个可以出现多次,并且还以<xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##any" processContents="lax"/>标记结尾,以便用户可以添加他们自己的数据元素以最简单的方式编程导出符合的XML(即理想情况下不需要它们定义自己的名称空间/ XSD)。对xsd进行进一步约束:any?

处理用户生成的XML时,我会忽略通过<any>标记添加的任何自定义元素,但是我想知道是否有强制元素名称唯一性的方法,以便我可以确定它们'是不是将maxOccurs=1中定义的元素的重复项放在一起?

下面是一个简单的XSD(交互式版本here):

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema xmlns="testxsd" targetNamespace="testxsd" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified"> 
    <xsd:element name="XSDSequence"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="itemA" type="xsd:string" 
          minOccurs="1" maxOccurs="1"/> 
       <xsd:element name="itemB" type="xsd:string" 
          minOccurs="0" maxOccurs="1"/> 
       <xsd:element name="itemC" type="xsd:string" 
          minOccurs="1" maxOccurs="1"/> 
       <xsd:any minOccurs="0" maxOccurs="unbounded" 
         namespace="##any" processContents="lax"/> 
      </xsd:sequence> 
     </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

这里是传递XSD验证,但我想对因错误出在最后的复制<itemA>一个示例XML:

<XSDSequence xmlns="testxsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <itemA>foo</itemA> 
    <itemC>bar</itemC> 
    <randomElement>this is ok</randomElement> 
    <itemA>I want this second itemA to cause an error</itemA> 
</XSDSequence> 

(请注意,通过属性而不是元素捕获数据项是东西,我婉吨至做。)

回答

1

不,XSD 1.0,一旦你允许任何元素,你不能指定超出那些minOccursmaxOccursnamespaceprocessContents提供进一步的约束。

在XSD 1.1中,您还可以针对xsd:any元素制作xsd:assertions;你可以用断言来表达你的约束。 [更新:不要错过@C. M. Sperberg-McQueen's simpler idea的XSD 1.1:xsd:any/@notQName="itemA itemB itemC"]

+0

谢谢,我认为这很可能是这种情况。 – ivanatpr

2

也许最简单的方法,以确保itemAitemB,并且itemC不重复的元素是使用namespace="##other"而不是namespace="##any"。 (这里假定名称空间testxsd中的元素不需要在这里出现。)

或者移动到XSD 1.1并添加属性notQName="itemA itemB itemC"

+0

确实,它在XSD 1.1中看起来像notQName =“## definedSibling”正是我想要的。在与各种消费者打交道时,支持XSD 1.1是一个非起步者,这是一个耻辱。使用XML/XSD作为数据传输格式的关键在于它几乎得到了普遍支持,并且XSD 1.1支持已经以蜗牛的速度起飞。 – ivanatpr