2013-05-29 42 views
2

我不知道我的問題是否正確提問。我有一個包含DTD的XML文檔。我已經定義了ATTLIST,並且我想限制或修改DTD,即如果我已經多次使用同一個屬性,則XML驗證會拋出錯誤或將失敗。 我的XML文檔看起來是這樣的:我可以修改/限制XML DTD的ATTLIST以允許使用UNIQUE屬性嗎?

<?xml version="1.0" encoding="utf-8"?> 
<!-- DTD START --> 
<!DOCTYPE dtype 
[ 
    <!ELEMENT dtype (ea?, eb?, ec, ed?) > 
    <!ELEMENT ea  (data+)    > 
    <!ELEMENT eb  (ee+)    > 
    <!ELEMENT ec  (data+)    > 
    <!ELEMENT ed  (data+)    > 
    <!ELEMENT ee  (data+)    > 
    <!ELEMENT data (#PCDATA)   > 

    <!ATTLIST ee 
        ef  CDATA #REQUIRED 
    > 
    <!ATTLIST data 
        element CDATA #REQUIRED 
        value CDATA #IMPLIED 
        unit CDATA #IMPLIED 
        min  CDATA #IMPLIED 
        max  CDATA #IMPLIED 
        avg  CDATA #IMPLIED 
    > 
]> 
<!-- DTD END --> 

<!-- DATA START --> 
<dtype> 
    <ec> 
    <data element="A" unit="counts" min="0.6621" avg="0.6819" max="0.7089" /> 
    <data element="B" unit="counts" min="0.0463" avg="0.0473" max="0.0503" /> 
    <data element="C" unit="counts" min="0.1238" avg="0.1264" max="0.1344" /> 
    </ec> 
</dtype> 
<!-- DATA END --> 

<!-- should be detected as not ok ! --> 
<!-- 
<dtype> 
    <ec> 
    <data element="A" unit="counts" min="0.6621" avg="0.6819" max="0.7089" /> 
    <data element="B" unit="counts" min="0.0463" avg="0.0473" max="0.0503" /> 
    <data element="B" unit="counts" min="0.1238" avg="0.1264" max="0.1344" /> 
    <data element="C" unit="counts" min="0.1348" avg="0.1644" max="0.1654" /> 
    </ec> 
</dtype> 
--> 

我想限制DTD允許一個屬性element="B"例如。

這可能嗎?

回答

0

我認爲DTD中唯一的選擇是使屬性類型IDID必須是Namehttp://www.w3.org/TR/REC-xml/#NT-Name),所以這可能不適用於您的數據。 (它爲您的樣本數據element屬性雖然)。

例如,該XML是無效的,因爲element="A"使用了兩次:

<!DOCTYPE dtype 
[ 
    <!ELEMENT dtype (ea?, eb?, ec, ed?) > 
    <!ELEMENT ea  (data+)    > 
    <!ELEMENT eb  (ee+)    > 
    <!ELEMENT ec  (data+)    > 
    <!ELEMENT ed  (data+)    > 
    <!ELEMENT ee  (data+)    > 
    <!ELEMENT data (#PCDATA)   > 

    <!ATTLIST ee 
        ef  CDATA #REQUIRED 
    > 
    <!ATTLIST data 
        element ID #REQUIRED 
        value CDATA #IMPLIED 
        unit CDATA #IMPLIED 
        min  CDATA #IMPLIED 
        max  CDATA #IMPLIED 
        avg  CDATA #IMPLIED 
    > 
]> 
<!-- DTD END --> 

<!-- DATA START --> 
<dtype> 
    <ec> 
     <data element="A" unit="counts" min="0.6621" avg="0.6819" max="0.7089" /> 
     <data element="B" unit="counts" min="0.0463" avg="0.0473" max="0.0503" /> 
     <data element="A" unit="counts" min="0.1238" avg="0.1264" max="0.1344" /> 
    </ec> 
</dtype> 
+0

丹尼爾,感謝您的回答,但我仍然有一個問題。我第一次沒有正確發佈它,但是我的xml也可能看起來像這樣:'data element =「A」... />',這將無效 - 每個'可以在xml文件中出現多次,但我希望**每個部分**有效。任何提示如何做到這一點? – akm

+0

@akm - 我不認爲你可以用DTD來完成這項工作。我認爲你可以使用模式,但很長一段時間我不需要這樣做。如果你願意的話,當我有空閒的時候,我可以試着想出一個模式。 –

+0

丹尼爾,感謝你的努力,但我認爲你不需要在這上面花時間。我只是想/希望有一個很容易實現的方法。這個XML是從我的SQL服務器生成的,需要將信息傳輸到我的計算引擎(_Mathematica_); xml生成過程應該確保沒有重複。也許,我只是在尋找一種「保險」來100%保證它。我將花更多時間在xml生成和讀取過程中擁有獨特的屬性。不管怎麼說,還是要謝謝你! – akm

相關問題