2013-09-24 28 views
1

您可以使用XSD将XML元素的内容限制为与其祖父母相同吗?所以,这通过验证:XSD:限制内容如果存在,则与祖父母相同

<pupil> 
<pupilid>342424</pupilid> 
<name>John Smith</name> 
<assessment> 
<assessmentid>1</assessmentid> 
<pupilid>342424</pupilid> 
</assessment> 
</pupil> 

失败验证:

<pupil> 
<pupilid>342424</pupilid> 
<name>John Smith</name> 
<assessment> 
<assessmentid>1</assessmentid> 
<pupilid>666</pupilid> 
</assessment> 
</pupil> 

回答

2

,如果你认为上面的参照完整性你可以做到这一点。人们可以很容易地说有多余的信息,但我也看到它是由于模型重用。

这是你的XML是什么样子:

enter image description here

这就是XSD会再看看这样的:

enter image description here

和源:

<?xml version="1.0" encoding="utf-8"?> 
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)--> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="pupil"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="pupilid" type="xsd:unsignedInt"/> 
       <xsd:element name="name" type="xsd:string"/> 
       <xsd:element name="assessment"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="assessmentid" type="xsd:unsignedByte"/> 
          <xsd:element name="pupilid" type="xsd:unsignedInt"/> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
     <xsd:key name="PK"> 
      <xsd:selector xpath="pupilid"/> 
      <xsd:field xpath="."/> 
     </xsd:key> 
     <xsd:keyref name="FK" refer="PK"> 
      <xsd:selector xpath="assessment/pupilid"/> 
      <xsd:field xpath="."/> 
     </xsd:keyref> 
    </xsd:element> 
</xsd:schema> 

你的第一个XML会通过验证,而第二个可能产生:

Error occurred while loading [], line 8 position 3 The key sequence '666' in Keyref fails to refer to some key. xsd-restrict-content-to-be-equal-to-grandparent-if-it-is-present.xml is XSD 1.0 invalid.

只要这些类型的约束可以模拟类似意味着什么参照完整性数据库的人,那么键/唯一和keyref可以提供帮助。

对于更一般的共约束条件,除了XSD 1.0之外,您必须移至XSD 1.1或使用Schematron。

+0

感谢这工作 –