2015-10-16 57 views
0

请考虑下面的XML:XSD架构强制性内容

<?xml version="1.0" encoding="utf-8"?> 
<asset> 
    <object name="pippo" logical="pippo"></object> 
    <object name="pluto" logical="pluto"></object> 
    <object name="paperino" logical="paperino"></object> 
    <object name="ziopaperone" logical="paperino"></object> 
    <object name="topolino" logical="paperino"></object> 
</asset> 

我需要写有以下限制的模式:名称为“皮波”

  1. 对象和“冥王星”绝存在且仅出现一次
  2. 具有其他名称的对象可能存在或不存在
  3. 属性“名称”和“逻辑”必须相同(但这不是强制性的)

我已经能够指定点号1,通过指定名称的simpleType作为xs:ID的一个子集,并对值有限制,但我无法弄清楚如何将点1与点2.

你能帮我吗?这可能吗?

谢谢

回答

0

你所追求的是不与XSD直接的,因为它会要求你创建三种类型(一个用于“皮波”,一为“冥王星”,一个用于其余部分),但具有相同的元素名称。根据定义,任何具有相同路径的元素必须具有相同的类型。如果您想尝试你的建议是什么,您会收到以下错误:

E [Xerces] cos-element-consistent: Error for type 'objectType'. Multiple elements with name 'object', with different types, appear in the model group.

由于所有的规则都作为基本规则,即“任何事情都会发生”,这是不可能的XSD单独1.0解决这个问题,因为它会产生含糊的元素:处理器无法知道上例中的第一个object是“其他名称的对象”类型,还是“只有pippo/pluto”类型。这种模糊不允许(如果有人试图将模型映射到POCO或POJO上,会产生问题)。

但是,有一种解决方法。如果您可以使用XSD 1.1,则可以使用断言。例如,下面的作品(包括您的规则#3,但执行(如在你问了这句话的半句就变成没有规则可言):

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="urn:test" 
    targetNamespace="urn:test" 
    elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" 
    vc:minVersion="1.1"> 

    <xs:element name="asset" type="objectType">   
    </xs:element> 

    <xs:complexType name="objectType"> 
     <xs:sequence minOccurs="2" maxOccurs="unbounded"> 
      <xs:element name="object" type="objectOtherType"/> 
     </xs:sequence> 
     <xs:assert test="object[1]/@name = 'pippo'" xpathDefaultNamespace="##targetNamespace"/> 
     <xs:assert test="object[2]/@name = 'pluto'" xpathDefaultNamespace="##targetNamespace"/> 
     <xs:assert test="every $o in object satisfies $o/@logical = $o/@name" xpathDefaultNamespace="##targetNamespace"/> 
    </xs:complexType> 

    <xs:complexType name="objectOtherType"> 
     <xs:attribute name="name" type="otherNames" use="required" /> 
     <xs:attribute name="logical" type="otherNames" use="required" /> 
    </xs:complexType> 

    <xs:simpleType name="otherNames"> 
     <xs:restriction base="xs:string" /> 
    </xs:simpleType> 

</xs:schema> 

如果XSD 1.1是不可能的在你的情况下,你应该重新考虑你的对象模型(这可能是一个好主意),例如,通过使用具有独特属性的元素的唯一名称,以便您可以强制执行该模型。作为另一种选择,可以考虑使用RelaxNG或Schematron作为模式语言,它们都允许这种约束。您还可以将Schematron(它非常类似于XSD 1.1中的断言)与现有的XSD模式结合使用