IMSC 中的名稱空間
本文涵蓋了 XML 名稱空間的主題,為您提供了足夠的知識來識別其在 IMSC 中的用法,並能有效使用它。
什麼是 XML 名稱空間?
名稱空間基本上是您在 XML 中用來區分不同標記家族(這些家族可能擁有同名特徵)的機制,並允許它們在同一個文件中使用。
為了幫助您理解我們的意思,讓我們用一個現實世界的例子——人類的姓氏。世界上有很多叫 Mary 的人。一種區分他們的方法是使用他們的全名——可能有一個 Mary Smith 和一個 Mary Jones。
在 XML 中,您也可以為元素和屬性賦予一個“家族名稱”,這就是它們的名稱空間。名稱空間定義了一個 XML 詞彙表屬於哪個家族,通常由一個識別符號字串組成。<p> 元素在 HTML 和 IMSC 中都可用,所以也許您可以使用 html 名稱空間來指定 HTML 的 <p>,並使用 imsc 來指定 IMSC 的 <p>?
像許多事情一樣,事情並沒有那麼簡單。可能還有另一個名為 IMSC 的 XML 詞彙表,而且它與字幕無關。這和 Mary Smith 一樣——世界上有很多 Mary Smith,所以需要更多資訊來區分她們——她們的生日、髮色、地址等等。
所以通常您會使用更長的字串作為名稱空間名稱。URL 是非常流行的名稱空間形式。它易於記憶,並且還可以指向關於該 XML 詞彙表的更多資訊。
- W3C 標準 IMSC 使用 URL
http://www.w3.org/ns/ttml作為<p>元素的名稱空間。 - 對於 HTML 中的
<p>,名稱空間是http://www.w3.org/1999/xhtml。
如果您使用名稱空間 http://www.w3.org/ns/ttml,那麼可以安全地假設您指的是 IMSC 詞彙表中的元素。
在文件中設定名稱空間
那麼,如何在 IMSC 文件中表示 <p> 元素屬於 http://www.w3.org/ns/ttml 名稱空間?您需要在文件中包含該名稱空間。簡單的方法是在來自該名稱空間的每個元素和屬性中包含它。您透過在其 xmlns 屬性中指定名稱空間識別符號來設定元素的名稱空間。
<tt xmlns="http://www.w3.org/ns/ttml" xml:lang="en">
<body xmlns="http://www.w3.org/ns/ttml">
<div xmlns="http://www.w3.org/ns/ttml">
<p xmlns="http://www.w3.org/ns/ttml">Hello world</p>
</div>
</body>
</tt>
但這效率不高。想象一個包含數百個字幕的文件。這將非常冗長。
預設名稱空間
幸運的是,您不需要這樣做——而是可以使用預設名稱空間。如果您將文件根元素的 xmlns 屬性設定為 http://www.w3.org/ns/ttml,則根元素內的所有元素都將繼承此名稱空間——它們也將擁有該名稱空間。
<tt xmlns="http://www.w3.org/ns/ttml" xml:lang="en">
<body>
<div>
<p>Hello world</p>
</div>
</body>
</tt>
在此示例中,<tt>、<body>、<div> 和 <p> 元素都具有 http://www.w3.org/ns/ttml 名稱空間。
因為 IMSC 文件中幾乎所有您需要的 XML 元素都在 http://www.w3.org/ns/ttml 名稱空間中,這讓工作變得容易多了。如果您想在 IMSC 文件中使用來自其他詞彙表的元素,您仍然可以覆蓋預設名稱空間。
<tt xmlns="http://www.w3.org/ns/ttml" xml:lang="en">
<head>
<metadata>
<documentPublisher xmlns="urn:ebu:tt:metadata">MDN</documentPublisher>
</metadata>
</head>
<body>
<div>
<p>Hello world</p>
</div>
</body>
</tt>
<documentPublisher> 元素來自 EBU Part M 元資料詞彙表。該詞彙表中的元素的名稱空間是 urn:ebu:tt:metadata。透過將 <documentPublisher> 元素上的 xmlns 屬性設定為 urn:ebu:tt:metadata,http://www.w3.org/ns/ttml 名稱空間將被覆蓋。現在 <documentPublisher> 元素及其所有後代都具有 urn:ebu:tt:metadata 名稱空間。
覆蓋預設名稱空間更好的方法是使用字首。
<tt xmlns="http://www.w3.org/ns/ttml" xml:lang="en"
xmlns:ebuttm="urn:ebu:tt:metadata">
<head>
<metadata>
<ebuttm:documentPublisher>MDN</ebuttm:documentPublisher>
</metadata>
</head>
<body>
<div>
<p>Hello world</p>
</div>
</body>
</tt>
我們將在下一節中解釋 XML 名稱空間字首如何工作。
帶名稱空間的屬性
我們已經討論了元素,但是如何指定 IMSC 屬性的名稱空間,並且不至於太冗長?與 XML 元素相反,屬性沒有預設名稱空間。
此外,IMSC 屬性包含在多個名稱空間中。讓我們進一步解釋——在 IMSC 中,有不同類別的屬性,例如樣式屬性。不同類別具有不同的名稱空間。例如,所有樣式屬性的名稱空間是 http://www.w3.org/ns/ttml#styling。
就像 XML 元素一樣,為每個屬性始終編寫完整的名稱空間會太冗長,例如 color_http://www.w3.org/ns/ttml#styling="yellow"。
幸運的是,XML 有字首的概念。字首可以被認為是名稱空間的“快捷方式”。例如,我們可以在根元素上定義一個屬性名稱空間。
<tt xmlns="http://www.w3.org/ns/ttml" xml:lang="en"
xmlns:tts="http://www.w3.org/ns/ttml#styling"/>
透過在 <tt> 元素上定義 xmlns:tts="http://www.w3.org/ns/ttml#styling,您將字首 tts“繫結”到樣式名稱空間。隨後,每當您在屬性(或元素)前加上 tts(加上冒號)時,它就會被賦予 http://www.w3.org/ns/ttml#styling 名稱空間。這樣,您就可以在整個文件中使用字首,而不是每次都輸入完整的名稱空間。
<tt xmlns="http://www.w3.org/ns/ttml" xml:lang="en"
xmlns:tts="http://www.w3.org/ns/ttml#styling" >
<body>
<div>
<p tts:color="yellow" tts:fontSize="120%">
Hello world
</p>
<p tts:color="white" tts:fontSize="120%">
Hi!
</p>
</div>
</body>
</tt>
更具可讀性,不是嗎?
注意: 名稱空間/字首匹配僅是文件範圍內的約定。理論上,您可以使用除 tts 之外的其他字首來繫結樣式名稱空間。定義 xmlns:foo="http://www.w3.org/ns/ttml#styling" 然後編寫 <p foo:color="yellow"> 是完全合法的。但是,如果您使用 IMSC 標準的 名稱空間部分 中列出的官方字首,您的 IMSC 文件會更具可讀性。