2013-09-24 29 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

感謝這工作 –