XSD具有不同子元素的同名嵌套元素

时间:2015-02-05 12:44:24

标签: xml xsd complextype

我正在重新编写XSD,以便在接受数据时更具体。有一个complexType接受名称为“part”的所有元素,其中包含属性“partname”,而不验证部件中的任何子节点。这是当前的complexType XSD代码:

<xs:complexType name="partType" mixed="true">
    <xs:sequence>
        <xs:any maxOccurs="unbounded" processContents="lax" />
    </xs:sequence>
    <xs:attribute name="partname" type="stringtype" use="required" />
</xs:complexType>

以下是我用XML收到的“部分”类型的示例:

<part partname="customer">
    <seq>1</seq>
    <type>owner</type>
    <part partname="conviction">
        <convictionCode>12345</convictionCode>
        <convictionDate>2011-06-02</convictionDate>
        <fine />
        <term />
        <type />
        <age>22</age>
        <suspension>0</suspension>
    </part>
    <part partname="claim">
        <dateOfLoss>2010-05-05</dateOfLoss>
        <claimType>Accident</claimType>
        <claimCost />
        <claimFault>No</claimFault>
        <type>owner</type>
    </part>
</part>

当相同元素以多种形式出现并且可以相互嵌套时,我无法找到有关如何实现内容验证的信息。

赞赏任何适用语法的建议

2 个答案:

答案 0 :(得分:2)

你写

  

当相同元素以多种形式出现并且可以相互嵌套时,我无法找到有关如何实现内容验证的信息。

通常,当父元素可以具有与父元素同名的子元素(或更常见的后代)时,适用以下两种情况之一:

  1. 父元素和子元素具有相同的类型,在结构上是递归的。

    在这种情况下,关键要求是确保递归可以终止,方法是确保类似名称的子项的出现是可选的。在这里,使元素或其类型或两者都成为顶级模式组件也是至关重要的。

    E.g。

    <element name="e" type="e"/>
    <complexType name="e">
      <sequence minOccurs="0" maxOccurs="unbounded">
        <element ref="e"/>
      </
    </
    
  2. 父元素和子元素具有不同的类型。

    这里使用的关键技术机制是地点;在最常见的情况下,外部或父元素将是顶级元素,而内部或子元素将是外部元素类型的本地元素。

    E.g。

    <element name="e" type="e"/>
    <complexType name="e">
      <sequence minOccurs="0" maxOccurs="unbounded">
        <element name="e" type="nested-e"/>
      </
    </
    <complexType name="nested-e">
      <sequence>
        <element ref="a"/>
        <element ref="b"/>  
        <element ref="c"/>
      </
    </
    
  3. 这并未解决您在名为&#39; part&#39;的子元素中显示的结构变化。如果您无法重新设计词汇表以为不同类型和祖先的元素指定不同的名称,则需要使用条件类型赋值和/或断言来查找XSD 1.1解决方案。

答案 1 :(得分:0)

XSD将验证您的XML,但不会检查嵌套的part元素;嵌套的部分元素将属于xs:any的未经检查的领域:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="part" type="partType"/>
  <xs:complexType name="partType">
    <xs:sequence>
      <xs:any maxOccurs="unbounded" processContents="lax" />
    </xs:sequence>
    <xs:attribute name="partname" use="required" />
  </xs:complexType>
</xs:schema>

你可以在这里停下来使用上面的XSD,但为了收紧它并检查嵌套的part元素,你可能会认为你可以使用这个XSD:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="part" type="partType"/>
  <xs:complexType name="partType">
    <xs:sequence>
      <xs:any maxOccurs="unbounded" processContents="lax" />
      <xs:element maxOccurs="unbounded" name="part" type="partType"/>
    </xs:sequence>
    <xs:attribute name="partname" use="required" />
  </xs:complexType>
</xs:schema>

问题是,上述XSD违反了Unique Particle Attribution规则,因为part元素是否应根据xs:any或{{1}进行验证的含糊不清}}

如果您可以对XML进行结构性更改,以便在您的不同元素中包含一个固定的xs:element/@name="part"元素提前,则可以使用Unique Particle归因规则,parts仍允许您的递归结构和可变元素内容

XML

xs:any

XSD

此XSD将成功验证上述XML:

<?xml version="1.0"?>
<part partname="customer">
    <parts>
      <part partname="conviction">
        <parts/>
        <convictionCode>12345</convictionCode>
        <convictionDate>2011-06-02</convictionDate>
        <fine />
        <term />
        <type />
        <age>22</age>
        <suspension>0</suspension>
      </part>
      <part partname="claim">
        <parts/>
        <dateOfLoss>2010-05-05</dateOfLoss>
        <claimType>Accident</claimType>
        <claimCost />
        <claimFault>No</claimFault>
        <type>owner</type>
      </part>
    </parts>
    <seq>1</seq>
    <type>owner</type>
</part>