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 詞彙表的更多資訊。

如果您使用名稱空間 http://www.w3.org/ns/ttml,那麼可以安全地假設您指的是 IMSC 詞彙表中的元素。

在文件中設定名稱空間

那麼,如何在 IMSC 文件中表示 <p> 元素屬於 http://www.w3.org/ns/ttml 名稱空間?您需要在文件中包含該名稱空間。簡單的方法是在來自該名稱空間的每個元素和屬性中包含它。您透過在其 xmlns 屬性中指定名稱空間識別符號來設定元素的名稱空間。

xml
<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,則根元素內的所有元素都將繼承此名稱空間——它們也將擁有該名稱空間。

xml
<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 文件中使用來自其他詞彙表的元素,您仍然可以覆蓋預設名稱空間。

xml
<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:metadatahttp://www.w3.org/ns/ttml 名稱空間將被覆蓋。現在 <documentPublisher> 元素及其所有後代都具有 urn:ebu:tt:metadata 名稱空間。

覆蓋預設名稱空間更好的方法是使用字首。

xml
<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 有字首的概念。字首可以被認為是名稱空間的“快捷方式”。例如,我們可以在根元素上定義一個屬性名稱空間。

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 名稱空間。這樣,您就可以在整個文件中使用字首,而不是每次都輸入完整的名稱空間。

xml
<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 文件會更具可讀性。