IMSC 中的命名空间
本文介绍了 XML 命名空间,为您提供了足够的信息来识别它们在 IMSC 中的使用,并能够有效地使用它。
什么是 XML 命名空间?
命名空间基本上是您在 XML 中用来区分不同标记家族(它们可能具有相同名称的功能)并允许它们在同一文档中使用的机制。
为了帮助您理解我们的意思,让我们举一个现实世界中的例子——人类的姓氏。世界上有许多叫玛丽的人。区分她们的一种方法是使用她们的全名——可以有一个叫玛丽·史密斯的和一个叫玛丽·琼斯的。
在 XML 中,您也可以为元素和属性指定一个“姓氏”,即它们的命名空间。命名空间定义了 XML 词汇表所属的家族,通常由一个标识符字符串组成。<p>
元素在 HTML 和 IMSC 中都可用,所以也许您可以使用命名空间 html
来指定 HTML 的 <p>
,使用 imsc
来指定 IMSC 的 <p>
?
与许多事情一样,情况并非那么简单。可能存在另一个名为 IMSC 的 XML 词汇表,它可能与字幕无关。玛丽·史密斯也是如此——世界上有许多叫玛丽·史密斯的人,所以需要更多信息来区分她们——他们的生日、头发颜色、地址等。
所以通常您使用更长的字符串作为命名空间名称。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
。通过将 xmlns
属性设置为元素 <documentPublisher>
的 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 文档更具可读性。