級別: 中級
Elliotte Rusty Harold, 副教授, Polytechnic University
2005 年 8 月 18 日
在文檔序言中插入多個 xml-stylesheet
處理指令,為不同用戶提供不同的視圖。本文還將說明如何包括偽屬性來調整表示。
把內容與表示分離是 XML 的一個主要目標,XML 完美地實現了這一目標。一個文檔并不限于只使用一個樣式表,可以針對不同讀者和環境提供多個樣式表。本文將說明如何在 XML 文檔序言中包含多個 xml-stylesheet
處理指令,這些指令分別指向用于不同上下文的不同樣式表。
xml-stylesheet 處理指令
多數 XML 開發人員都非常熟悉 xml-stylesheet
處理指令:
<?xml-stylesheet type="text/css" href="mystyles.css"?>
|
將該指令放在 XML 文檔的序言中,在瀏覽器中打開該文檔時,瀏覽器就會從相對的 URL mystyles.css 中加載樣式表,并用它格式化文檔和顯示。這種功能得到了基本上所有現代 Web 瀏覽器的支持,除了 Lynx 以外。
但不那么眾所周知的是,并不限定您只使用一個樣式表。序言中可以包括多個 xml-stylesheet
處理指令。如果其中有多個指令指向 CSS,那么可以將每個樣式表中的規則組合在一起。這種行為非常適合模塊化。比如,可以導入一個樣式表來處理文檔中數學方面的樣式,并導入另一個樣式表來設置文檔中的文本樣式:
<?xml-stylesheet type="text/css" href="mathstyles.css"?> <?xml-stylesheet type="text/css" href="textstyles.css"?>
|
如果有兩個(或更多)樣式表中的樣式規則發生了沖突,那么序言中最后出現的那個樣式表將優先考慮。
使用指向不同 XSLT 樣式表或者同時包含指向 XSLT 樣式表和 CSS 樣式表的 xml-stylesheet
處理指令也是可能的。但是,我不建議這樣做。瀏覽器是不一致的,甚至無法預測會選擇哪一個樣式表,雖然通常不會優先選擇 XSLT 樣式表。
alternate 偽屬性
|
偽屬性
之所以稱為偽屬性,是因為處理指令不是元素,只有元素才能有屬性。
|
|
為了更容易理解一些,可使用 alternate
和/或 media
偽屬性。alternate
偽屬性的值可以是 yes 或 no:如果是 yes,那么處理指令引用的替換樣式表只在用戶要求時才會加載;否則處理指令引用的樣式表就是默認加載的基本樣式表。
比如,下面兩個處理指令規定了默認表示和大字體的替代表示:
<?xml-stylesheet type="text/css" href="regular.css"?> <?xml-stylesheet type="text/css" href="bigfonts.css" alternate="yes"?>
|
這樣做的時候還要包括 title
偽屬性,該屬性將告訴用戶如何對樣式表進行區分。比如:
<?xml-stylesheet type="text/css" title="Regular fonts" href="regular.css"?> <?xml-stylesheet type="text/css" title="Extra large title fonts" href="bigfonts.css" alternate="yes"?>
|
瀏覽器應該允許用戶選擇使用哪一種樣式表。對于 Mozilla 和 Firefox,可以在 View > Page Style 菜單中找到該選項。Microsoft? Internet Explorer 和 Safari 沒有提供該選項(使用默認樣式表)。
media 偽屬性
xml-stylesheet
處理指令還可以使用 media
偽屬性,表明樣式表適用的環境。比如,可以用一個樣式表格式化文檔,在一般的桌面或膝上監視器上顯示文檔,并用另一個樣式表在紙上打印該文檔,第三個樣式表則將文檔投影到面對聽眾的墻上。下面的文檔序言提供了所有這三種樣式選擇:
<xml version="1.0"?> <?xml-stylesheet type="text/css" media="screen" title="Regular fonts" href="regular.css"?> <?xml-stylesheet type="text/css" media="projection" title="Extra large fonts" href="bigfonts.css" alternate="yes"?> <?xml-stylesheet type="text/css" media="print" title="Smaller fonts" href="smallfonts.css" alternate="yes"?>
|
在這種情況下,瀏覽器應該自動選擇適當的樣式表,不需要更多的用戶干預。
media
偽屬性定義了 8 個值:
-
screen
—— 最常見,現代桌面或膝上計算機的顯示器。
-
tty
—— 定寬的終端,如 VT-100s 和 X-terms,適合于 Lynx。
-
tv
—— WebTV 或者類似的技術。
-
projection
—— 投影到大屏幕上。
-
handheld
—— PDA、蜂窩電話和類似的小屏幕設備。
-
print
—— 紙張。
-
braille
—— 盲文屏幕讀者。
-
aural
—— 聲音屏幕讀者。
media
偽屬性的值之間用逗號分隔。比如,以下 xml-stylesheet
處理指令表示樣式表可用于手持設備和具有更大位圖顯示設備的計算機:
<xml-stylesheet type="text/css" media="handheld, screen" href="styles.css"?>
|
此外,還可使用 media="all"
表示樣式表適用于所有媒體。(如果沒有出現 media
偽屬性,則該屬性為默認屬性。)當然,瀏覽器可能忽略不能理解的樣式規則。即使 font-size: 14pt
出現在 media="aural"
的樣式表中,屏幕瀏覽器也會忽略它。
最后,還可以為這個偽屬性定義新的、自定義的值。比如,可使用 three-d
這樣的值來引用一個用于顯示器的樣式表,該顯示器使用兩個嵌套 LCD 面板來表示三維圖像。但是,不是所有瀏覽器都能識別這個值。這一功能吸引的主要是瀏覽器廠商,他們可以定義自定義的值來識別自己使用的擴展,對單個 Web 開發人員來說,這一功能沒有多少用處。
結束語
XML 的最初目標之一是將內容與表示分離。它允許對同一文檔應用多個樣式表,從而為不同的用戶提供不同的視圖。在文檔中添加多個 xml-stylesheet
處理指令是實現該任務的一種方法。
參考資料
關于作者