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 文档会更具可读性。