2013-03-06 97 views
1

有沒有一種方法可以使用選擇(或其他技術)進行驗證,您需要至少一個具有不同父項的值。例如...XSD選擇驗證,其中元素具有不同的父項

<?xml version="1.0" encoding="UTF-8"?> 
<DOC> 
    <GROUP1> 
     <VAL1>TEST</VAL1> 
     <DATE1>20130306</DATE1> 
    </GROUP1> 
    <GROUP2> 
     <VAL2>TEST2</VAL2> 
     <DATE2>20130405</DATE2>   
    </GROUP2> 
</DOC> 

如何驗證此文檔是否至少有DATE1和/或DATE2中的一個?即如果DATE1和DATE2都爲空白,則文檔無效。

回答

1

它不能在XSD 1.0中完成。您必須使用Schematron擴充您的XSD 1.0,或者移至XSD 1.1(非常有限的支持)並使用斷言。

下面是一個使用XSD 1.1,根據您的描述可能的方式(空值,所以我想德恩是必填字段):

<?xml version="1.0" encoding="utf-8"?> 
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)--> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">  
    <xsd:element name="DOC"> 
     <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="GROUP1"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="VAL1" type="xsd:string"/>       
          <xsd:element name="DATE1" type="date"/> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
       <xsd:element name="GROUP2"> 
        <xsd:complexType> 
         <xsd:sequence> 
          <xsd:element name="VAL2" type="xsd:string"/> 
          <xsd:element name="DATE2" type="date"/> 
         </xsd:sequence> 
        </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 

      <xsd:assert test="string-length(concat(GROUP1/DATE1, GROUP2/DATE2)) gt 0"/> 
     </xsd:complexType> 
    </xsd:element> 

    <xsd:simpleType name="date"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:pattern value="|[0-9]{8}"/>   
     </xsd:restriction> 
    </xsd:simpleType>  
</xsd:schema>