2014-02-25 24 views
0

我想創建一個架構來強制跨相關元素進行內容驗證。如果第一個元素的內容是「ApplicationY」,那麼下一個元素必須是可見的和強制的。XML驗證>顯示特定枚舉值的新元素

<?xml version="1.0" encoding="utf-8"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Instructions"> 
    <xs:complexType> 
     <xs:sequence> 

     <xs:element name="Applications" > 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Application" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="ApplicationName"> 
         <xs:simpleType> 
         <xs:restriction base="xs:token"> 
          <xs:enumeration value="ApplicationX"/> 
          <xs:enumeration value="ApplicationY"/> 
          <xs:enumeration value="ApplicationZ"/> 
         </xs:restriction> 
         </xs:simpleType> 
        </xs:element> 

        <xs:element name="NextElementOnlyForApplicationY"> 
         <xs:simpleType> 
         <xs:restriction base="xs:token"> 
          <xs:enumeration value="Yes"/> 
          <xs:enumeration value="No"/> 
         </xs:restriction> 
         </xs:simpleType> 
        </xs:element> 

        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

回答

0

模式不能這樣做。模式可以做兩兩件事:

  1. 確保某些元素的存在,或在其他元素中的屬性
  2. 確保任何元素的內容是它自己的範圍內有效

一個模式不能強制元素的規則取決於另一元素的內容。

您可以做的是創建一個抽象基本元素Application,它具有更具體的元素(如ApplicationY)替代它們。更具體的元素可能需要額外的子元素或屬性。

架構:

<?xml version="1.0" encoding="utf-8"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:my="http://mynamespace" targetNamespace="http://mynamespace"> 
    <xs:element name="Instructions"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Applications" > 
        <xs:complexType> 
         <xs:sequence> 
          <xs:element ref="my:Application" maxOccurs="unbounded"/> 
         </xs:sequence> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="Application" abstract="true" /> 
    <xs:element name="ApplicationX" substitutionGroup="my:Application" /> 
    <xs:element name="ApplicationY" substitutionGroup="my:Application"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="ElementForApplicationY"> 
        <xs:simpleType> 
         <xs:restriction base="xs:token"> 
          <xs:enumeration value="Yes"/> 
          <xs:enumeration value="No"/> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="ApplicationZ" substitutionGroup="my:Application" /> 

</xs:schema> 

文獻:

<?xml version="1.0" encoding="utf-8"?> 
<my:Instructions xmlns:my="http://mynamespace"> 
    <Applications> 
     <my:ApplicationX /> 
     <my:ApplicationY> 
      <ElementForApplicationY>Yes</ElementForApplicationY> 
     </my:ApplicationY> 
     <my:ApplicationZ /> 
    </Applications> 
</my:Instructions> 

。注意,使用替代組的需要的元素是模式級元件,而不是內的。這意味着你需要定義一個名字空間。