IMSC 中的命名空间

本文介绍了 XML 命名空间,为您提供了足够的信息来识别它们在 IMSC 中的使用,并能够有效地使用它。

什么是 XML 命名空间?

命名空间基本上是您在 XML 中用来区分不同标记家族(它们可能具有相同名称的功能)并允许它们在同一文档中使用的机制。

为了帮助您理解我们的意思,让我们举一个现实世界中的例子——人类的姓氏。世界上有许多叫玛丽的人。区分她们的一种方法是使用她们的全名——可以有一个叫玛丽·史密斯的和一个叫玛丽·琼斯的。

在 XML 中,您也可以为元素和属性指定一个“姓氏”,即它们的命名空间。命名空间定义了 XML 词汇表所属的家族,通常由一个标识符字符串组成。<p> 元素在 HTML 和 IMSC 中都可用,所以也许您可以使用命名空间 html 来指定 HTML 的 <p>,使用 imsc 来指定 IMSC 的 <p>

与许多事情一样,情况并非那么简单。可能存在另一个名为 IMSC 的 XML 词汇表,它可能与字幕无关。玛丽·史密斯也是如此——世界上有许多叫玛丽·史密斯的人,所以需要更多信息来区分她们——他们的生日、头发颜色、地址等。

所以通常您使用更长的字符串作为命名空间名称。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。通过将 xmlns 属性设置为元素 <documentPublisher>urn:ebu:tt:metadata,命名空间 http://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 文档更具可读性。