2017-08-10 48 views
1

當定義在DTD的元素,有排除從其內容模型元素的特徵,例如:如何在XSD中進行內容排除?

<!ELEMENT i - - (%inline;) -(i)> 

代替分別重複每個元素的內容模型中,我們只列出類似的元件爲模型組(DTD中的實體)並排除我們在某些元素中不需要的內容。

在XML架構中,我可以使用具有繼承和/或模型組的複雜類型在元素之間共享相同的內容模型,但爲了排除一些元素,我必須重複整個內容模型而不添加不需要的元素。太多的代碼鍵入,閱讀,編輯...

是否有另一種簡單而美麗的方式來實現這在XML模式,或者我應該使用RelaxNG或尋找工具來生成模式?不久之後,在XML Schema術語中,我想(並且確實需要)諸如限制派生,但不重複內容模型。

回答

1

assert

這樣
not(./*/local-name-from-QName(node-name(.)) = 'put-name-to-exclude-here') 

可以做的伎倆,但需要XML架構1.1。

例如,使用一組(即,這在技術上是不完全受限制的推導):

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 
    <xs:group name="base"> 
     <xs:sequence> 
      <xs:element name="a" type="xs:string" minOccurs="0"/> 
      <xs:element name="b" type="xs:string" minOccurs="0"/> 
      <xs:element name="c" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
    </xs:group> 
    <xs:complexType name="excluding-a"> 
     <xs:sequence> 
      <xs:group ref="base"/> 
     </xs:sequence> 
     <xs:assert test="not(./*/local-name-from-QName(node-name(.)) = 'a')"/> 
    </xs:complexType> 
    <xs:element name="root" type="excluding-a"/> 
</xs:schema> 

這將是有效的:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <b/> 
    <c/> 
</root> 

,這將是無效的:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <a/> 
    <b/> 
    <c/> 
</root> 

明確使用派生的另一種方法涉及通過擴展推導,如un聽起來很直觀(限制將需要重複所有元素)。這是因爲關於派生的XML Schema的語義在值空間包含方面並不嚴格:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" 
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1"> 
    <xs:complexType name="base"> 
     <xs:sequence> 
      <xs:element name="a" type="xs:string" minOccurs="0"/> 
      <xs:element name="b" type="xs:string" minOccurs="0"/> 
      <xs:element name="c" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:complexType name="derived"> 
     <xs:complexContent> 
      <xs:extension base="base"> 
       <xs:assert test="not(*/local-name-from-QName(node-name(.)) = 'a')"/> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    <xs:element name="root" type="derived"/> 
</xs:schema> 
+0

哦,看起來不錯!我今晚會測試一下。版本1.1和使用內部類的組正是我想要的。 –