[Apuntes] Lenguajes de marcas: XML y Namespacing

Miguel Menéndez

XML y Namespacing.

Lenguajes de marcas

  • Orientados a la presentación: HTML, XHTML
  • Orientados a la descripción: XML, SGML
  • Orientados a procedimientos: LaTeX, PostScript
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE libros SYSTEM "libros.dtd">
<?xml-stylesheet type="text/xsl" href="estilos.xsl" ?>
<?xml-stylesheet type="text/css" href="estilos.css" ?>
<![CDATA[Con CDATA se puede escribir <div id='ID' class="clase"></div>]]>

Entidades

  • &gt; (>)
  • &lt; (<)
  • &amp; (&)
  • &quot; (")
  • &apos; (')

XML bien formados

  • Un único elemento raíz.
  • Elementos, atributos y entidades con sintaxis correcta:
    • Etiqueta inicial y final (las etiquetas únicas terminadas en />)
    • Atributos entre comillas o apóstrofes
    • Sensibilidad a mayúsculas y minúsculas

El contenido textual de los elementos y el valor textual de los atributos no pueden contener >, <, &, " ni ‘. Se deben utilizar entidades o CDATA. Sí pueden aparecer carácteres con tilde y eñes.

Los nombres de los elementos y los atributos deben ser nombres XML válidos, es decir, comenzar con una letra (con o sin tilde) o el signo de subrayado o dos puntos (desaconsejado pero válido). A continuación puede aparecer cualquier combinación de letras, números, puntos, guiones normales, guiones bajos y dos puntos. No puede haber espacios en blanco ni otros carácteres de puntuación diferentes a los mencionados.

Los nombres de los elementos no pueden comenzar con el texto xml ni en minúsculas, mayúsculas o combinando ambas.

No válidos: <9numero>, <numero?>, <núm telef>

Válidos: <numero>, <_número>, <núm_telef>, <numero9>

No válidos: <div></div id="">, <async>

Válidos: <div id=""></div>, <async="async">

Espacios de nombres

<?xml version="1.0" encoding="UTF-8" ?>
<document>
  <miguel.title>Documento de prueba</miguel.title>
  <content>
    <html>
      <head>
        <xhtml.title>Título XHTML</xhtml.title>
      </head>
      ...
<?xml version="1.0" encoding="UTF-8" ?>
<miguelmenendez.pro.document>
  <miguelmenendez.pro.title>Documento de prueba</miguelmenendez.pro.title>
  <miguelmenendez.pro.content>
    <www.w3c.org.html>
      <www.w3c.org.head>
        <www.w3c.org.title>Título XHTML</www.w3c.org.title>
        ...
<?xml version="1.0" encoding="UTF-8" ?>
<miguel:document xmlns:miguel="https://miguelmenendez.pro/document"
                xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <miguel:title>Documento de prueba</miguel:title>
  <miguel:content>
    <xhtml:html>
      <xhtml:head>
        <xhtml:title>Título HTML</xhtml:title>
      </xhtml:head>
      ...

Cualquier cadena de texto puede ser usada como prefijo del espacio de nombres. La URI del espacio de nombres sí debe ser única, aunque realmente no se comprueba mediante conexión alguna. La URI no es más que un nombre lógico del espacio de nombres.

<?xml version="1.0" encoding="UTF-8" ?>
<document xmlns="https://miguelmenendez.pro/document"
          xmlns:xhtml="http://www.w3.org/1999/xhtml">
  <title>Documento de prueba</title>
  <content>
    <xhtml:html>
      <xhtml:head>
        <xhtml:title>Título HTML</xhtml:title>
      </xhtml:head>
      ...

El ámbito de aplicación de un espacio de nombres por defecto es el del elemento en que se ha declarado y sus elementos descendientes. Los atributos, sin embargo, no están asociados a ningún espacio de nombres por defecto. Para que un atributo pertenezca a un espacio de nombres tiene que ir precedido de un prefijo.

<?xml version="1.0" encoding="UTF-8" ?>
<document xmlns="https://miguelmenendez.pro/document">
  <title>Documento de prueba</title>
  <content>
    <xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml">
      <xhtml:head>
        <xhtml:title>Título XHTML</xhtml:title>
      </xhtml:head>
      ...
<?xml version="1.0" encoding="UTF-8" ?>
<document xmlns="https://miguelmenendez.pro/document">
<!-- comienza el espacio de nombres de miguelsanchez.net -->
  <title>Documento de prueba</title>
  <content>
  <html xmlns="http://www.w3.org/1999/xhtml">
  <!-- desde aquí el espacio ahora es el de xhtml -->
    <head>
      <title>Título HTML</title>
    </head>
    ...

Si se usa el atributo xmlns="" en el interior de una etiqueta indica que ese elemento y sus hijos no usan ningún espacio de nombres:

<p xmlns="">

Comentarios

¿Has encontrado un error? ¿Crees que algo podría mejorarse? No dudes en comentármelo y estaré encantado de echarle un vistazo.