2017-08-25 169 views
0

例如:在DTD中,如何讓子元素與父類具有相同的名稱但屬性類型不同?

<row> 
    <row _id="1">......</row> 
    <row _id="2">......</row> 
</row> 

如何使用DTD來驗證成才這樣呢? xml的結構不可更改。

+1

那麼,如果你使隱含的_id屬性,那麼它不會進入你的方式外行。定義內容比較困難,而且你還沒有詳細說明內部行的內容。到目前爲止,我認爲你可能想看看'div'元素的XHTML DTD,它們可以嵌套,就像你想要嵌套你的'row'元素一樣,所以你可以按照那裏採取的方法。 –

回答

2

你說

XML的結構是不可改變的。

但可能值得注意的是,在實踐中幾乎從未如此。你可能無法說服你的數據源(或者是在語言規範技術中爲你設置了一個學術難題的人)轉向​​一種不同的(也許更合理的,或者至少更容易理解的)設計, t意味着XML的結構不能改變。 XML處理中最有用的技術之一是:如果您的輸入不是您想要的形式,請在處理之前將其轉換爲您想要的形式。

你的問題的答案取決於你的意思。

從字面上看,您是否可以在DTD中「讓」一個具有相同名稱的子項和父項具有不同的屬性。正如Martin Honnen在評論中已經指出的那樣,答案是「是的,只是將所有屬性都發生在一個元素上,而不是兩個元素都是可選的,並且只在適當的時候使用它們」。

但是,如果您想要的不僅僅是啓用指定表單的實例文檔,而是強制執行一些「行」元素(父母)沒有屬性但其他「行」元素(子元素)有一個ID屬性,也許是必需的,那麼答案是否定的,你不能用DTD做到這一點。 DTD只有一種元素類型,每個名稱只有一個元素聲明,這意味着在DTD中,父'行'和子'行'實例是相同元素類型的實例,它具有已聲明的可能屬性集合。 (事實上​​,你希望父母和孩子擁有不同的屬性本身就是一個很好的證明,在你的設計中它們是不同的元素類型,觀察者可能會問爲什麼你堅持要用同一個名字來調用兩個不同的元素類型。應用程序不夠複雜,所以你必須通過在你的標記中引入無意義的模糊來使它變得更具挑戰性?)

其他模式語言(如XSD和RelaxNG)都有本地聲明,因此可能有多種元素類型同名。

+1

對於具有DTD的XML或SGML應用程序來說,除了那些可以由DTD描述的規則之外,這還是前所未聞的。 HTML將是一個典型的例子,因爲DTD允許''在''內。 –

相關問題