2017-04-13 63 views
1

我有以下XML:如何讓XML元素通過XSD出現在任何地方?

<root> 
    <someNode> 
    <someChild attr="val" /> 
    </someNode> 

    <otherNode> 
    <otherChild> 
     <otherSubChild /> 
    </otherChild> 
    </otherNode> 
</root> 

這方面的一個有效的XML模式會很容易。現在的問題是,我的程序必須支持解析文件時評估的特殊元素,並導致元素的條件替換。

例子:

<root> 
     <someNode> 
     <if environment="DEV"> 
      <someChild attr="val" /> 
     </if> 
     <if environment="PROD"> 
      <someChild attr="otherVal" /> 
     </if> 
     </someNode> 

     <otherNode> 
     <otherChild> 
      <if environment="DEV"> 
      <otherSubChild /> 
      </if> 
     </otherChild> 
     </otherNode> 
    </root> 

我覺得你的想法。事實是,在if元素是允許在XML出現到處,但允許包括這是允許它被放在元素任何元素的同時,

我如何定義這在一個好方法?目前,我的XML模式中有大約90種類型/元素,手動編輯每種類型/元素以允許允許正確的子元素的if元素會非常麻煩。

是否有可能制定一個架構,允許if元素如上所述?

回答

1

因此,您已經指定了內容模型的層次結構,具體說明哪些元素可以出現在其他元素中,以什麼數量以及可能以何種順序出現。現在你想添加,順便說一句,一個if元素可以包裝任何現有的元素在任何地方?

你不能在XSD中做到這一點。無法修改這些特定指令,或者沒有事先爲這種可能性做出規定,您無法以這種方式在全球範圍內解決所有特定約束。 (例如,如果您定義了一個element substitution group,可能會在您的文檔中出現多個位置,則可以輕鬆地向該組添加新成員。)

有一種方法可以說任何元素都可以出現在指定位置一個內容模型(xs:any),但是沒有辦法說給定的元素可以出現在所有內容模型的任何地方。在XSD 1.1中,有一種允許在內容模型中使用open content的新機制,但這也允許使用前瞻性規定,而不是追溯性全局調整。

一個建議可能是在XML的with-if和without-if形式之間編寫一個簡單的XSLT轉換並分別驗證這些文檔。

另一種方法是將您的條件表達爲將出現在任何元素上的屬性,而不是可以包裹任何其他元素的元素。這仍然需要更新到您的XSD,但更新會更容易做到,同時保留現有的內容模型。

+0

使用屬性()聽起來很有希望。我會評估這是否涵蓋了我的需求。 – user826955

0

也許您可以嘗試爲<if>元素及其屬性定義基本complexType,然後將<someChild><otherChild>聲明爲此類型的擴展。