xml:lang en esquemas de documentos XML

Pregunta

¿Cuándo debo utilizar xml:lang y cuándo debo definir mi propio elemento o atributo para enviar valores de idioma a un esquema de documento XML (DTD)?

En ocasiones, los documentos contienen o incluyen diferentes tipos de contenido en idioma natural. Otras veces, necesitan almacenar un valor de idioma natural como dato o metadato acerca de algún elemento externo al documento. Debido a que estas diferentes aplicaciones emplean formatos similares, a veces los diseñadores de esquemas no están seguros respecto de cuándo deben utilizar xml:lang y cuándo definir sus propios elementos o atributos relacionados con el idioma.

Por ejemplo, en XHTML 1.0, hay un atributo hreflang y también xml:lang (o atributo lang, en el caso de HTML) para el contenido del elemento a:

<a xml:lang="es" href="xyz" hreflang="de">Haga clic para alemán</a>

El atributo xml:lang describe el idioma contenido por el elemento a, "Haga clic para alemán", en tanto que el atributo hreflang es un metadato, que en este caso describe el idioma de cierto contenido externo a esta página web.

Respuesta

Cuándo utilizar xml:lang

El contenido directamente asociado con el documento XML (ya sea que esté contenido en el documento directamente o que considere parte del documento cuando se procesa o presenta) debe utilizar el atributo xml:lang para indicar el idioma de ese contenido. Dicho atributo xml:lang debe reservarse para que los autores de contenido etiqueten directamente todo contenido de idioma natural que puedan tener.

XML 1.0 define xml:lang como un atributo común que puede emplearse para indicar el idioma del contenido de cualquier elemento. Esto incluye todo texto humano que pueda leerse, así como otros contenidos (por ejemplo, objetos incorporados como imágenes o archivos de sonido) incluidos en el elemento en el cual aparecen. El valor xml:lang se aplica a cualquier subelemento contenido por el elemento. También se aplica a los valores de atributos asociados con el elemento y los subelementos (aunque utilizar idioma natural en atributos no es la mejor práctica). El valor del atributo xml:lang es una etiqueta de idioma definida por BCP 47.

Por ejemplo, aquí aparece xml:lang en un elemento t:

<t xml:lang="es">
   Esto es una parte del texto contenido por el elemento "t". El uso
   del atributo xml:lang indica el idioma, de modo que, por
   ejemplo, se podría aplicar la fuente correcta cuando se presenta, o
   se podría utilizar el corrector ortográfico adecuado cuando se edita el
   documento. Si no tuviéramos xml:lang, podríamos tener problemas
   con el contenido incorporado, como la frase <span xml:lang="fr">
   C'est la vie</span>, que aparece en otro idioma.
</t>

Este ejemplo muestra cómo xml:lang se aplica a un atributo:

<para>Il faut utiliser <abbr title="Simple Object Access Protocol" xml:lang="en">SOAP</abbr></para>

Cuándo utilizar su propio elemento o atributo

Cuando el valor de idioma es realmente un atributo o un metadato referido a cierto contenido externo, xml:lang no es la elección adecuada. En estos casos, es necesario almacenar información sobre el idioma, pero éste no se refiere al contenido del documento XML (o contenido incluido, como imágenes, que se procesan como parte del documento) directamente. En este caso, hay que definir un elemento o atributo utilizando un nombre diferente, sin emplear el atributo xml:lang. El valor del elemento o atributo debe utilizar BCP 47, al igual que xml:lang.

Algunos ejemplos de esto podrían incluir:

La razón por la cual elegiría crear su propio elemento (o atributo) es transmitir el idioma como un valor (como parte de una estructura de datos o como metadato relacionado con un documento externo), en lugar de indicar el idioma de una parte específica de contenido. Evitar el uso de xml:lang para describir valores de idioma externos evita generar problemas a los autores de contenido, quienes necesitan etiquetar contenido para los fines del procesamiento de textos.

Por ejemplo, un documento XML podría verse de esta manera:

<item type="DVD">
  <title xml:lang="fr">Cyrano de Bergerac</title>
  <!-- indica el idioma del título de la película -->
  <runningTime value="137" />
  <!-- no involucra idioma -->
  <dialogue>en</dialogue>
  <!-- indica el idioma del diálogo -->
  <subtitles track="1" language="zh-Hant" />
  <!-- esta pista contiene subtítulos en chino tradicional -->
  <subtitles track="2" language="zh-Hans" />
</item>

En este ejemplo, el atributo xml:lang transmite información acerca del idioma natural del texto que aparece en este documento. El elemento dialogue y el atributo language del elemento subtitles se definen en el esquema del documento XML, y transmiten un valor de idioma natural asociado con esos elementos. Por ejemplo, transmite la información de que los subtítulos de la Pista n.º 1 están escritos o se muestran en chino tradicional (zh-Hant).

A propósito

Es importante recordar que xml:lang tiene un determinado alcance: los elementos en el nivel inferior heredan el atributo de idioma. Esto puede emplearse para identificar el idioma para gran cantidad de contenido (sin tener etiquetas de idioma redundantes en cada elemento). Por ejemplo, es una buena práctica poner xml:lang en su elemento html al comienzo de un documento XHTML y sólo reutilizarlo donde cambie el idioma del documento. Para obtener más información, véase el artículo Etiquetas de idiomas en HTML y XML.

Aplicar xml:lang a un atributo es problemático: no hay forma de:

  1. identificar más de un idioma en el atributo del título

    <p title="French (français)">Bonjour</p>
  2. separar el idioma utilizado en el atributo del utilizado en el elemento.

    <a title="anglais" href="qa-when-xmllang.en.html" lang="en" xml:lang="en">English</a>

Observe que los tres idiomas de esquema (XML DTD, XML Schema y RELAX NG) difieren con respecto a la cuestión de si un usuario debe definir xml:lang antes de utilizarlo como atributo. Específicamente: