2009-02-24 62 views
9

我有一個客戶需要XHTML有效的網站。他們使用W3C驗證器檢查它。XHTML驗證,自定義名稱空間和屬性

我要添加自己的命名空間和屬性,所以我可以做這樣的事情:

<div my:userid="123"> ... </div> 

從我的理解,定義自定義命名空間是完全有效的XHTML,只要我做到這一點:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:my="http://www.example.com/my"> 

但是,我的XHTML驗證失敗。問題似乎是驗證程序實際上沒有出去並檢查我的自定義DTD文檔是否存在我的自定義名稱空間,它只檢查XHTML是否與已知的DTD匹配。任何人都可以闡明我如何解決這個問題?

+0

我不明白爲什麼驗證程序將檢查命名空間的DTD。無論如何,瀏覽器也不會檢查DTD,而且我傾向於相信你實際上並沒有使用正確的XHTML,也就是說你爲該網頁發送了Content-type:text/html標題。但我可能是錯的。 – 2009-02-24 10:48:41

回答

6

對於XHTML 1.0,你被限制在XHTML 1.0的元素和屬性:

Normative Definition of XHTML 1.0

這XHTML的版本提供嚴格符合XHTML 1.0的文檔,這僅限於元素和屬性的定義XML和XHTML 1.0命名空間。

我的理解是,XHTML 2.0的目標是提供一個框架來做你想做的事情。

5

從我的理解,定義自定義命名空間是完全有效的XHTML

都能跟得上。自定義名稱空間完全是XML格式良好的,但「有效」具有特定含義,即所使用的每個元素和屬性均在文檔的模式中聲明。該模式可以是DTD,XML模式或其他類型,但是您必須聲明它。

因此,您可以聲明自己的模式以將自定義屬性添加到該語言中,實際上,XHTML Modularization使這非常簡單。您必須在prolog中將對DTD的引用添加爲<!DOCTYPE>;只是設置名稱空間URI並不會給XML處理器任何掛鉤來查找本身的模式。

但是,你寫的是「有效的我的語言,這是一個有點像XHTML」,而不是「有效的XHTML」。這些「我的語言」中的一些是衆所周知的,比如「XHTML + MathML + SVG」,但它仍然不是XHTML,如果您的客戶端已經設置爲「有效的XHTML」,則不能使用它們中的任何一個。

你也遇到了潛在的瀏覽器問題,特別是IE瀏覽器,IE8之前的IE調用了Element。* etAttribute *系列的一些奇怪的東西。除非您實際上將文檔作爲XML Content-Type(IE無法處理)提供,否則您的所有命名空間內容實際上並不實際使用命名空間。

在[X] HTML5中,有一個建議允許用戶自定義屬性(主要用於腳本目的)進入名稱以'data-'開頭的屬性。但在此期間的通常的方法是隱藏值另一個屬性,例如類:

<div class="userid-123">...</div> 

然後提取在腳本中使用合適的字符串處理過的className的數據。

+0

是的,隱藏類屬性中的值是我的備用解決方案,但顯然它不是非常優雅,我想要的東西不那麼「髒」。最優雅的解決方案是以數據開頭的屬性名稱 - 就像您提到的一樣,但現在看起來我必須等待:-) – 2009-02-25 13:02:22

3

我有一個網站,客戶需要XHTML有效。他們使用W3C 驗證程序進行檢查。

我已經有一些成功與W3C驗證使用,不xmlns=,但走的是標準的XHTML DTD和增加在最後的幾個屬性爲bobince上述描述。我用這把由所述PHPTAL模板系統使用的屬性,如

<html metal:define-macro="m"> 

我同意你需要的是不是XHTML,但XHTML的超集。但是,如果您的客戶準備通過將W3C驗證程序指向您的URL進行測試,那麼請繼續。有關建議,請參閱WDG

+0

http://www.alistapart.com/articles/customdtd/ 如果你通過W3C驗證器運行這樣的文件,你會發現它驗證得非常好....不幸的是,當你在瀏覽器中顯示文件時,]>出現在屏幕上。沒有辦法解決這個問題,所以這種方法是正確的。 – davidcl 2009-04-15 13:10:31

0

1.0不允許此。如果您真的想這樣做,您應該下載現有的dtd並將其保存在您的服務器中並定義爲private而不是public。但W3C的驗證沒有通過,因爲它只驗證了原始的