XSL

María Jesús Lamarca Lapuente. Hipertexto: El nuevo concepto de documento en la cultura de la imagen.

Inicio     navega al azar mapa conceptual  buscar
 

XSL o Extensible Stylesheet Language no se trata de un único lenguaje, sino de toda una familia de recomendaciones del World Wide Web Consortium (http://www.w3.org/Style/XSL/) para expresar Hojas de estilo en lenguaje XML. El lenguaje XSL consta de tres partes:

xslt, xpath y xsl-fo   proceso de transformación

Una hoja de estilo XSLT especifica la presentación de una clase de documentos XML para describir cómo un evento de clase se transforma dentro de un documento XML que usa un vocabulario formateado tal como (X)HTML o XSL-FO.

A pesar de la existencia de las CCS u Hojas de Estilo en Cascada que sirven para definir las presentaciones de los documentos en la Web, se ha creado otra forma específica para las presentaciones en XML. Esto se debe a que las CCS u Hojas de Estilo en Cascada son eficaces para describir formatos y presentaciones, pero no sirven para decidir qué tipo de datos deben ser mostrados y cuáles no deben salir en la pantalla. CCS se utiliza con documentos XML en los casos en los que debe mostrarse todo su contenido.

XLM no sólo sirve para especificar cómo queremos presentar los datos de un documento XML, sino también para filtrar los datos de acuerdo con ciertas condiciones. XSL es más complejo que las CCS  y permite muchas más funciones que las Hojas de Estilo, ya que se asimila más a un lenguaje de programación. Además de la presentación visual, XLS permite otras opciones como la ejecución de bucles y sentencias, operaciones lógicas, ordenación de datos, selecciones por comparación, utilización de plantillas, etc.

XSL o eXtensible Stylesheet Language define o implementa el lenguaje de estilo de los documentos escritos para XML. Desde 1997 varias empresas informáticas como Arbortext, Microsoft e Inso se pusieron a trabajar en una propuesta de XSL (antes llamado "xml-style") que presentaron al W3C y cuyo fin era permitir modificar el aspecto de un documento. Con las Hojas de Estilo ya se podían lograr algunas mejoras en el aspecto del documento, pero XSL permite otras muchas aplicaciones como múltiples columnas, texto girado, orden de visualización de los datos de una tabla, múltiples tipos de letra con amplia variedad en los tamaños, etc.

El lenguaje SGML tiene su propio estándar para la transformación y representación de sus documentos en forma de árbol, el DSSSL (Document Style Semantics and Specification Language, ISO10179), que en realidad es un lenguaje de programación completo y muy potente basado en el dialecto Scheme del lenguaje LISP. Por tanto, ya que XML es una versión reducida de SGML parecía lógico hacer también una versión reducida del DSSSL, llamada en este caso XSL (Extended Stylesheet Language).

El estándar XSL está basado en el lenguaje de semántica y especificación de estilo de documento (DSSSL, Document Style Semantics and Specification Language) y, por otro lado, se considera más potente que las hojas de estilo en cascada (CSS, Cascading Style Sheets), usado en un principio con el lenguaje HTML. Las CSS se usan para visualizar simples estructuras de documentos XML y hoy se ha conseguido una gran integración en XML con el protocolo CSS2 (Cascading Style Sheets, level 2) ofreciendo nuevas formas de composición y una más rápida visualización), pero XSL es sumamente útil cuando se requiere una mayor potencia de diseño en los documentos XML, sobre todo cuando éstos encierran datos estructurados como tablas, organigramas, etc. 

Así pues, básicamente, XSL es un lenguaje de hojas de estilos diseñado para su utilización en la Web, que provee más funcionalidades que las hojas de estilo en cascada (CSS o Cascade Stylesheet) y proporciona un representación de forma independiente de la plataforma utilizada o del medio de representación de la información recogida en los  documentos XML. Dicha representación se crea mediante la formación de un árbol de objetos de flujo (flow objects tree). Un objeto de flujo tiene una clase, la cual representa una tarea o actividad de representación. Asimismo, un objeto de flujo dispone de un conjunto de características, mediante las cuales se puede especificar mucho más la representación. La asociación de elementos en el árbol origen con los objetos de flujo se lleva a cabo mediante las reglas de construcción, las cuales contienen un patrón para identificar elementos específicos en el árbol origen, y una acción para especificar un subárbol resultante de objetos de flujo.

El procesador de hojas de estilo procesará de forma recursiva los elementos del origen para producir un completo árbol de objetos de flujo. Además de las reglas de construcción, XSL también soporta reglas de estilo, las cuales permiten la mezcla de características. Mientras que una sola regla de construcción puede ser invocada para un elemento en particular del origen, pueden ser invocadas todas las reglas de estilo aplicables,  permitiendo la mezcla de características como en CSS.

Resumiendo, un hoja de estilo XSL describe el proceso de presentación a través de un pequeño conjunto de elementos XML. Esta hoja, puede contener elementos de reglas que representan a las reglas de construcción y elementos de reglas de estilo que representan a las reglas de mezcla de estilos.

En cuanto a la inclusión de imágenes en las páginas XML, estas son sólo enlaces, luego pueden representarse de cualquier modo soportado por las especificaciones XLink y Xpointer, incluyendo la utilización de una sintaxis similar a las imágenes HTML existentes. Estas especificaciones, sin embargo, ofrecen un mejor control sobre la activación y cruce de  enlaces, por lo que se puede elegir, por ejemplo, si se carga o no una imagen al cargar una página, o mediante un clic del ratón, o en una ventana adicional, sin tener que cambiar el código.

Los soportes para formatos gráficos son un problema específico de los navegadores y visualizadores, y por tanto de la definición del XSL específico. XML por sí mismo ni predice ni restringe nada. Los formatos que se perfilan como de mayor utilidad son GIF, JPG, TIFF y CGM.

Para una explicación más detallada de cómo funciona XSL, se puede consultar la web del World Wide Web Consortium: What Is XSL. (http://www.w3.org/Style/XSL/WhatIsXSL.html) y para una información más completa sobre Hojas de estilo, ver la página Web style sheets (http://www.w3.org/Style/)

xml a html     xml a html

 

 xml a dhtml       xml a wml

XSLT

XSLT está recogido en la Recomendación del W3C: XSL Transformations (XSLT) Version 2.0 http://www.w3.org/TR/xslt20/

Una transformación en el lenguaje XSLT está expresada en la forma de una hoja de estilo, cuya sintaxis está bien formada en XML conforme a la Recomendación Namespaces in XML (http://www.w3.org/TR/REC-xml-names/).

Una hoja de estilo generalmente incluye tanto elementos que están bien definidos por XSLT como elementos que no están definidos por XSLT. Los elementos definidos XSLT se distinguen por el uso de namespaces o espacios de nombre http://www.w3.org/1999/XSL/Transform, tal y como se refiere en la especificación como el XSLT namespace. Esta especificación es una definición de la sintaxis y semántica de los espacios de nombre XSLT.

El término hoja de estilo refleja el hecho de que uno de los roles más importantes de XSLT es también añadir información de estilo a un documento fuente XML para transformarlo en un documento que consta de objetos de formato XSL, o en otro formato orientado a la presentación, tal como HTML, XHTML, o SVG. Sin embargo, lo que caracteriza a XSLT es que se usa para un gran número de tareas de transformación, no exclusivamente para aplicaciones de formato y presentación.

Una transformación expresada en XSLT describe reglas para transformar cero o procesomás recursos en árbol en cero o más recursos en árbol. La estructura de estos árboles se describe en el Modelo de Datos (Data Model). La transformación se realiza mediante un conjunto de reglas de patrón. Una regla asocia un patrón, con nodos iguales en el documento fuente, con un constructor de secuencias. En algunos casos, la evaluación del constructor de secuencias originará la construcción de nuevos nodos, los cuales pueden usarse para producir parte del árbol resultante. La estructura de los árboles resultantes puede ser completamente diferente de la estructura de los árboles fuente. En la construcción del árbol resultante, los nodos de los árboles fuente pueden ser filtrados y reordenados, y puede añadirse una nueva estructura. Este mecanismo permite que las hojas de estilo sean aplicadas a una extensa clase de documentos que tienen estructuras de recursos similares.

Una hoja de estilo puede constar de varios módulos de hojas de estilo contenidos en diferentes documentos XML. Para una transformación dada, una de estas funciones es el módulo de hojas de estilo principal (principal stylesheet module.) La hoja de estilo completa se adjunta para encontrar los módulos de hojas de estilo directa o indirectamente referenciados desde el modulo de hoja de estilo principal usando los elementos xsl:include y xsl:import .

Una aplicación concreta de XLT es, por ejemplo, su utilización para diseñar un portal. Al poder separar el contenido (XML) de la presentación (XLT) es posible utilizar un mismo entramado o esqueleto para diseñar un portal en XML y cambiar la apariencia gráfica utilizando una plantilla u hoja de estilo mediante XLT.

Xpath

XPath es un lenguaje para direccionar partes de un documento XML, y está diseñado tanto para ser utilizado con XSL como por  XPointer. Se trata de una especificación W3C: http://www.w3.org/TR/xpath

XPath también proporciona una serie de funcionalidades básicas para  manipular cadenas, números y booleanos. XPath opera sobre la estructura lógica abstracta de un documento XML, más que en su sintaxis superficial y se denomina así por el uso que hace de una notación  de caminos, como en los URLs, para navegar a través de la estructura jerárquica  de un documento XML.

 

Además de su uso para direccionar, XPath esta diseñado  también de modo que tiene un subconjunto natural que puede usarse para cotejar (comprobar si un nodo encaja con un patrón o no); este uso de XPath se describe en  XSLT.

 

XPath modela un documento XML como un árbol de nodos. Hay diferentes tipos de nodos, incluyendo nodos elemento, nodos atributo y  nodos texto. XPath define un modo de calcular un valor de cadena  para cada tipo de nodo. Algunos tipos de nodo también  tienen nombres. XPath es totalmente compatible con XMLNamespaces.  Así, el  nombre de un nodo se modela como un par consistente en una parte local y  un (quizá nulo) URI de espacio de nombres; a esto se le llama un nombre expandido. Imagen XPath

 

El modelo de datos es el siguiente:

 

El árbol contiene nodos. Hay siete tipos de nodos:

  •  nodos raíz: El nodo raíz es la raíz del árbol. No aparecen nodos raíz salvo como raíz del árbol. El nodo elemento del elemento de documento es hijo del nodo raíz. El nodo raíz tiene también como hijos los nodos instrucción de procesamiento y comentario correspondientes a las instrucciones de procesamiento y comentarios que aparezcan en el prólogo y tras el fin del elemento de documento. El valor de cadena del nodo raíz es la concatenación de los  valores de cadena de todos los nodos texto descendientes del nodo raíz en orden de documento. El nodo raíz no tiene nombre expandido.

  •  nodos elemento: Hay un nodo elemento por cada elemento en el documento. Los nodos elemento tienen un nombre expandido calculado expandiendo el QName del elemento especificado en la etiqueta de acuerdo con la Recomendación XML Names. El URI de espacio de nombres del nombre expandido del elemento será nulo si el QName no tiene prefijo y no hay un espacio de nombres por defecto aplicable. Los hijos de un nodo elemento son los nodos elemento, nodos comentario, nodos instrucción de procesamiento y nodos texto que contiene. Las referencias de entidades tanto a entidades internas como externas son expandidas. Las referencias de caracteres son resueltas. El valor de cadena de un nodo elemento es la concatenación de los valores de cadena de todos los nodos texto descendientes del nodo elemento en orden de documento. Los nodos elemento pueden tener un identificador único (ID). Este es el valor del atributo que se declara en el DTD como de tipo ID. No puede haber dos elementos en un documento con el mismo ID. Si un procesador XML informa de la existencia de dos elementos de un documento con el mismo ID (lo cuales posible sólo si el documento es no valido)  entonces el segundo elemento en orden de documento debe ser tratado como si no tuviese ID. Si un documento no tiene DTD, entonces ningún elemento del documento tendrá ID.

  •  nodos texto: Los datos de carácter se agrupan en nodos texto. En cada nodo texto se agrupan todos los datos de carácter que sea posible: un nodo texto nunca tiene un hermano inmediatamente anterior o siguiente que sea nodo texto. El valor de cadena de los nodos texto son los datos de carácter. Los nodos texto siempre tienen al menos un carácter. Cada carácter en una sección CDATA se trata como datos de carácter. Así, <![CDATA[<]]> en el documento fuente será tratado igual que &lt;. Ambos darán lugar a un único carácter  < en un nodo texto en el árbol. Por tanto, una sección CDATA se trata como si  <![CDATA[ y ]]> se quitasen y cada aparición de < y & fuese reemplazada por &lt; y &amp; respectivamente. Cuando un nodo texto que contiene un carácter < se escribe como XML, el carácter <  debe ser escapado mediante, por ejemplo, el uso de &lt;, o incluyéndolo en una sección CDATA.

  •  nodos atributo: Cada nodo elemento tiene asociado un conjunto de nodos atributo; el elemento es el padre de cada uno de esos nodos atributo; sin embargo, los nodos atributo no son hijos de su elemento padre.

  •  nodos espacio de nombres: Cada elemento tiene un conjunto asociado de nodos espacio de nombres, uno para cada uno de los distintos prefijos de espacio de nombres con efecto sobre el elemento (incluyendo el prefijo xml, que está implícitamente declarado según la Recomendación de Espacios de Nombres XML) y uno para el espacio de nombres por defecto si hay alguno con efecto sobre el elemento. El elemento es el padre de cada uno de los nodos espacio de nombres; sin embargo, los nodos espacio de nombres no son hijos de su elemento padre. Los elementos nunca comparten nodos espacio de nombres: Si dos nodos elemento son distintos, entonces ninguno de los nodos espacio de nombres del primer elemento será el mismo nodo que ningún nodo espacio de nombres del otro nodo elemento. Esto significa que los elementos tendrán un nodo espacio de nombres:

    • para cada atributo del elemento cuyo nombre empiece por xmlns:;

    • para cada atributo de un elemento ancestro cuyo nombre empiece por xmlns: salvo que el propio elemento o un ancestro más cercano  redeclaren el prefijo;

    • para atributos xmlns, si el elemento o alguno de sus ancestros tienen dicho atributo y el valor del atributo en el más cercano de los elementos que lo tienen es no vacío.

  •  nodos instrucción de procesamiento: Hay un nodo instrucción de procesamiento para cada instrucción de procesamiento, salvo para aquellas que aparezcan dentro de la declaración de tipo de documento. Las instrucciones de procesamiento tienen un nombre expandido: la parte local es el destinatario de la instrucción de procesamiento; el URI de espacio de nombres es nulo. El valor de cadena de un nodo instrucción de procesamiento es la parte de la instrucción de procesamiento que sigue al destinatario y todo el espacio en blanco. No incluye la terminación ?>.

  •  nodos comentario: Hay un nodo comentario para cada comentario, salvo para aquellos que aparezcan dentro de la declaración de tipo de documento. El valor de cadena de los comentarios es el contenido del comentario sin incluir el inicio <!-- ni la terminación  -->. Los nodos comentario no tienen  nombre expandido.

Para cada tipo de nodo, hay una forma de determinar un valor de cadena para los nodos de ese tipo. Para algunos tipos de nodo, el valor de cadena es parte del nodo; para otros tipos de nodo, el valor de cadena se calcula a partir del valor de cadena de nodos descendientes.

 

La construcción sintáctica básica en XPath es la expresión. Una expresión se ajusta a la regla de producción Expr.  Las expresiones son evaluadas para producir un objeto, que tendrá uno de los siguientes cuatro tipos básicos:

  •  Conjunto de nodos (una colección desordenada de nodos sin duplicados)
  •  booleano (verdadero o falso) 
  •  número (un número en punto flotante)
  •  cadena (una secuencia de caracteres UCS) 

La evaluación de expresiones tiene lugar respecto  a un contexto.  XSLT y XPointer especifican cómo se determina el contexto  para las expresiones XPath usadas en XSLT y XPointer respectivamente. El  contexto consiste en:

  •  Un nodo (el nodo contextual ).

  •  un par de enteros positivos no nulos ( la posición contextual y el tamaño contextual): La posición contextual es siempre menor o igual que el tamaño contextual.

  •  un conjunto de asignaciones de  variables (correspondencia de nombres de variable a valores de variable.  El valor de una variable es un objeto, que puede ser de cualquiera de los tipos posibles para el valor de una expresión, y puede también ser de tipos adicionales no especificados aquí). 

  •  una biblioteca de funciones (correspondencia  de nombres de funciones a funciones.  Cada función toma cero o más argumentos y devuelve un único resultado).

  •  el conjunto de declaraciones de espacios de nombres aplicables a la expresión (correspondencia de prefijos a URIs de espacios de nombres).

Un tipo importante de expresión es el camino de localización. Un camino de localización selecciona un conjunto de nodos relativo al nodo de contexto.  El resultado de evaluar una expresión que sea un camino de localización es el conjunto de nodos seleccionados por el camino de localización.  Los caminos de localización pueden contener recursivamente expresiones utilizadas para filtrar conjuntos de nodos. Un camino de localización se ajusta a la regla de producción LocationPath.

  •  child::para selecciona los elementos para hijos del nodo contextual

  •  child::* selecciona todos los elementos hijos del nodo contextual

  •  child::text() selecciona todos los nodos texto hijos del nodo contextual

  •  child::node() selecciona todos los hijos del nodo contextual, cualquiera que sea su tipo de nodo

  •  attribute::name selecciona el atributo name  del nodo contextual

  •  attribute::* selecciona todos los atributos del nodo contextual

  •  descendant::para selecciona los elementos para  descendientes del nodo contextual

  •  ancestor::div selecciona todos los ancestros div del nodo contextual

  •  ancestor-or-self::div selecciona los ancestros div del nodo contextual y, si el nodo contextual es un elemento div, el nodo contextual también

  •   descendant-or-self::para selecciona los elementos para descendientes del nodo contextual y, si el nodo contextual es un elemento para , el nodo contextual también

  •  self::para selecciona el nodo contextual si este es un elemento para , en otro caso no selecciona nada

  •  child::chapter/descendant::para selecciona los elementos  para descendientes de los elementos chapter hijos del nodo contextual

  •  child::*/child::para selecciona todos los nietos para del nodo contextual

  •  / selecciona la raíz del documento (que es siempre el padre del elemento de documento)

  •  /descendant::para selecciona todos los elementos para en el mismo documento que el nodo contextual

  •  /descendant::olist/child::item selecciona todos los elementos item que tienen un padre olist y que estén en el mismo documento que el nodo contextual

  •  child::para[position()=1] selecciona el primer hijo para del nodo contextual

  •  child::para[position()=last()] selecciona el último hijo para del nodo contextual

  •  child::para[position()=last()-1] selecciona el penúltimo hijo para del nodo contextual

  •  child::para[position()>1] selecciona todos los hijos para del nodo contextual salvo el primero

  •  following-sibling::chapter[position()=1]   selecciona el siguiente hermano chapter del nodo contextual

  •  preceding-sibling::chapter[position()=1]   selecciona el anterior hermano chapter del nodo contextual

  •  /descendant::figure[position()=42] selecciona el cuadragésimo segundo elemento figure en el documento

  •  /child::doc/child::chapter[position()=5]/child::section[position()=2]   selecciona la segunda section del quinto chapter del elemento de documento doc

  •  child::para[attribute::type="warning"]   selecciona todos los hijos para del nodo contextual que tengan un atributo type con valor warning

  •  child::para[attribute::type='warning'][position()=5]   selecciona el quinto hijo para del nodo contextual que tenga un atributo  type con valor  warning

  •  child::para[position()=5][attribute::type="warning"]   selecciona el quinto hijo  para  del nodo contextual si ese hijo tiene un atributo type con valor  warning

  •  child::chapter[child::title='Introduction']   selecciona los hijos  chapter del nodo contextual que tengan uno o más hijos title con  string-value   igual a  Introduction

  •  child::chapter[child::title] selecciona los hijos   chapter del nodo contextual que tengan uno o más hijos  title

  •  child::*[self::chapter or self::appendix]   selecciona los hijos  chapterappendix del nodo contextual

  •  child::*[self::chapter or self::appendix][position()=last()]   selecciona el último hijo chapter o appendix del nodo contextual

Hay dos tipos de caminos de localización:

  •  caminos de localización relativos: consiste en una secuencia de uno o más pasos de localización separados por /.  Los pasos en un camino de localización relativo se componen de izquierda a derecha. Cada paso selecciona un conjunto de nodos relativos a un nodo contextual. Una secuencia inicial de pasos se une al paso siguiente de la siguiente forma.  La secuencia inicial de pasos selecciona un conjunto de nodos relativos a un nodo de contexto. Cada nodo de ese conjunto se usa como nodo de contexto para el siguiente paso. Los distintos conjuntos de nodos identificados por ese paso se unen. El conjunto de nodos identificado por la composición de pasos es dicha unión. Por ejemplo, child::div/child::para selecciona los elementos para hijos de los elementos div hijos del nodo contextual, o, en otras palabras, los elementos para nietos que tengan padres  div.

  •  caminos de localización absolutos: consiste en  / seguido opcionalmente por un camino de localización relativo.  Una  / por si misma selecciona el nodo raíz del documento que contiene al nodo contextual. Si es seguida por un camino de localización relativo, entonces el camino de localización selecciona el conjunto de nodos que  seleccionaría el camino de localización relativo relativo al nodo raíz del documento que contiene al nodo contextual.

Un paso de localización tiene tres partes:

  •  un eje, que especifica la relación jerárquica entre los nodos seleccionados por el paso de localización y el nodo contextual,

  •  una prueba de nodo, que especifica el tipo de nodo y el  nombre-expandido de los nodos seleccionados por el paso de localización, y

  •  cero o más predicados, que usan expresiones arbitrarias para refinar aún más el conjunto de nodos seleccionado por el paso de localización.

La sintaxis del paso de localización es el nombre de eje y prueba de nodo separados por dos caracteres de dos puntos, seguido de cero o más expresiones, cada una entre paréntesis cuadrados. Por ejemplo, en child::para[position()=1] , child es el nombre del eje, para es la prueba de nodo y [position()=1] es un predicado.

 

El conjunto de nodos seleccionado por el paso de localización es el que resulta de generar un conjunto de nodos inicial a partir del eje y prueba de nodo, y a continuación filtrar dicho conjunto por cada uno de los predicados sucesivamente.

 

El conjunto de nodos inicial se compone de los nodos que tengan la relación con el nodo contextual que se especifica en el eje, y tengan el tipo de nodo y nombre-expandido especificados por la prueba de nodo. Por ejemplo, un paso de localización descendant::para selecciona los elementos para descendientes del nodo contextual: descendant especifica que cada nodo en el conjunto de nodos inicial debe ser un descendiente del contexto; para especifica que cada nodo en el conjunto de nodos inicial debe ser un elemento llamado para . El significado de algunas pruebas de nodos depende del eje.

 

El conjunto de nodos inicial se filtra por el primer predicado para generar un nuevo conjunto de nodos; este nuevo conjunto de nodos es entonces filtrado usando el segundo predicado, y así sucesivamente. El conjunto de nodos final es el conjunto de nodos seleccionado por el paso de localización. El eje afecta a la forma en que se evalúa la expresión de cada predicado y, por tanto, la semántica de un predicado se define con respecto a un eje.

 

Están disponibles los siguientes ejes:

  •  El eje child contiene los hijos del nodo contextual

  •  El eje descendant contiene los descendientes del nodo contextual; un descendiente es un hijo o el hijo de un hijo, etc; de este modo el eje descendant nunca contiene nodos atributo o espacio de nombres

  •  El eje parent contiene el  padre del nodo contextual, si lo hay

  •  El eje ancestor contiene los ancestros del nodo contextual; los ancestros del nodo contextual consisten en el  padre del nodo contextual y el padre del padre, etc; así, el eje ancestor siempre incluirá al nodo raíz, salvo que el nodo contextual sea el nodo raíz

  •  El eje  following-sibling contiene todos los siguientes hermanos del nodo contextual; si el nodo contextual es un nodo atributo o un nodo espacio de nombres, el eje following-sibling está vacío

  •  El eje preceding-sibling contiene todos los hermanos precedentes del nodo contextual; si el nodo contextual es un nodo atributo o un nodo espacio de nombres, el eje preceding-sibling está vacío

  •  El eje  following contiene todos los nodos del mismo documento que el nodo contextual que están después de este según el orden del documento, excluyendo los descendientes y excluyendo nodos atributo y nodos espacio de nombres

  •  El eje preceding contiene todos los nodos del mismo documento que el nodo contextual que están antes de este según el orden del documento, excluyendo los ancestros y excluyendo nodos atributo y nodos espacio de nombres

  •  El eje attribute contiene los atributos del nodo contextual; el eje estará vacío a no ser que el nodo contextual sea un elemento

  •  El eje  namespace contiene los nodos espacio de nombres del nodo contextual; el eje estará vacío a no ser que el nodo contextual sea un elemento

  •  El eje self contiene simplemente el propio nodo contextual

  •  El eje descendant-or-self contiene el nodo contextual y sus descendientes

  •  El eje ancestor-or-self contiene el nodo contextual y sus ancestros; así, el eje "ancestor-or-self" siempre incluirá el nodo raíz

Los ejes ancestor, descendant,following, preceding y self particionan un documento (ignorando los nodos atributo y espacio de nombres): no se superponen y juntos contienen todos los nodos del documento. 

Cada eje tiene un tipo principal de nodo. Si un eje puede contener elementos, entonces el tipo principal de nodo es elemento; en otro caso, será el tipo de los nodos que el eje contiene. Así,

  •  Para el eje attribute, el tipo de nodo principal es atributo
  •  Para el eje namespace,  el tipo de nodo principal es espacio de nombres.
  •  Para los demás ejes,  el tipo de nodo principal es elemento

Una prueba de nodo que sea un  QName (nombre calificado) es verdadera si y solo si el tipo del nodo es el tipo principal de nodo y tiene un nombre expandido igual al nombre expandido especificado por el QName. Por ejemplo, child::para selecciona los elementos  para hijos del nodo contextual; si el nodo contextual no tiene ningún hijo para , seleccionará un conjunto vacío de nodos. attribute::href selecciona el atributo href del nodo contextual; si el nodo contextual no tiene atributo href, seleccionará un conjunto vacío de nodos.

 

Un  QName en la prueba de nodo se expande en un nombre expandido utilizando las declaraciones de espacio de nombres del contexto de la expresión. Esta es la misma forma en que se hace la expansión para los nombres de tipos de elemento en las etiquetas de inicio y fin salvo que el espacio de nombres por defecto declarado con xmlns no se utiliza: si el QName no tiene prefijo, entonces el URI de espacio de nombres es nulo (esta es la misma forma en que se expanden los nombres de atributos). Será un error que el  QName tenga un prefijo para el cual no haya una declaración de espacio de nombres en el contexto de la expresión.

 

Una prueba de nodo * es verdadera para cualquier nodo del tipo principal de nodo. Por ejemplo, child::*  seleccionará todo elemento hijo del nodo contextual, y attribute::* seleccionará todos los atributos del nodo contextual.

 

Una prueba de nodo puede tener la forma NCName:*. En este caso, el prefijo es expandido de la misma forma que con un  QName, utilizando las declaraciones de espacio de nombres del contexto. Será un error que no haya una declaración de espacio de nombres para el prefijo en el contexto de la expresión. La prueba de nodo será verdadera para cualquier nodo del tipo principal cuyo nombre expandido tenga el URI de espacio de nombres al qué el prefijo se expande, con independencia de la parte local del nombre.

 

La prueba de nodo text() es verdadera para cualquier nodo de texto. Por ejemplo, child::text() seleccionará los nodos de texto hijos del nodo contextual. Análogamente, la prueba de nodo comment() es verdadera para cualquier nodo comentario, y la prueba de nodo processing-instruction() es verdadera para cualquier instrucción de procesamiento. La prueba processing-instruction()  puede tener un argumento que sea Literal; en este caso, será verdadera para cualquier instrucción de procesamiento que tenga un nombre igual al valor del Literal.

 

Una prueba de nodo node() es verdadera para cualquier nodo de cualquier tipo que sea.

 

Los ejes están orientados hacia adelante o hacia atrás. Un eje que solo puede contener el nodo contextual o nodos que están a continuación del nodo contextual según el orden de documento es un eje hacia adelante. Un eje que solo puede contener el nodo contextual o nodos que están antes del nodo contextual según el orden de documento es un eje hacia atrás. Así, los ejes ancestor, ancestor-or-self, preceding, y preceding-sibling son ejes hacia atrás; todos los demás ejes son hacia adelante. Dado que el eje self siempre tendrá a lo sumo un nodo, no supone ninguna diferencia que sea un eje hacia adelante o hacia atrás. La posición de proximidad de un miembro de un conjunto de nodos con respecto a un eje se define como la posición del nodo en el conjunto ordenado según el orden de documento si el eje es hacia adelante y según el orden inverso de documento si el eje es hacia atrás. La primera posición es 1.

 

Un predicado filtra un conjunto de nodos con respecto a un eje para producir un nuevo conjunto de nodos. Por cada nodo en el conjunto de nodos a filtrar, la PredicateExpr es evaluada con dicho nodo como nodo contextual, con el número de nodos en el conjunto de nodos como tamaño contextual, y con la posición de proximidad del nodo en el conjunto de nodos respecto al eje como posición contextual; si PredicateExpr se evalúa como verdadera para ese nodo, el nodo se incluye en el nuevo conjunto de nodos; en otro caso,  no se incluye.

 

Una PredicateExpr se evalúa evaluando la  Expr y convirtiendo el resultado en un booleano. Si el resultado es un número, se convertirá en verdadero si el número es igual a la posición contextual y se convertirá en falso en otro caso; si el resultado no es un número, entonces el resultado se convertirá igual que con una llamada a la función boolean. Así un camino de localización para[3] es equivalente a para[position()=3] .

 

Las expresiones se analizan dividiendo primero la cadena de caracteres a analizar en tokens y a continuación analizando la secuencia de tokens resultante. Se puede usar libremente espacio en blanco entre tokens.  El proceso de tokenización se describe en Estructura Léxica. En la tokenización, siempre se devuelve el token más largo posible.

 

La especificación también alude a las  funciones que las implementaciones de XPath deben incluir siempre en la librería de funciones que se usa para evaluar expresiones. Hay funciones de conjunto de nodos, de cadenas, booleanas y numéricas.

Existe también una Especificación llamada XML Path Language (XPath) 2.0. (http://www.w3.org/TR/xpath20/). En la versión 2, XPath  es un lenguaje de expresión que permite el procesamiento de conformidad al modelo de datos definido en XQuery 1.0 and XPath 2.0 Data Model. (http://www.w3.org/TR/xpath-datamodel/) El modelo de datos también ofrece una representación de árbol de los documentos XML. XPath 2.0 es un conjunto de XPath 1.0 con algunas capacidades añadidas, como la de soportar un conjunto más rico de tipos de datos, y usar los esquemas de XML Schema para validar los documentos.

XSL Formatting Objects (XSL-FO)

El eXtensible Stylesheet Language Formatting Objects (XSL-FO) es una Recomendación del W3C: http://www.w3.org/TR/xsl.

Desafortunadamente, el término XSL se usa a menudo tanto en un sentido genérico, como en otro específico, lo que crea una gran confusión. Como ya hemos afirmado, genéricamente, XSL es, en la actualidad, una familia de 3 Recomendaciones producidas por el W3C: XSL Transformations (XSLT), XML Path Language (XPath), y eXtensible Stylesheet Language (el uso específico de XSL). Para borrar la confusión entre los usos genéricos y específicos de XSL, mucha gente se refiere a la última especificación (que actualmente especifica el formateador de objetos) como XSL-FO.

Hay también una confusión importante sobre las diferencias entre XSL-FO y CSS. CSS  o Cascading Style Sheets es un lenguaje de hojas de estilo externo. Se usa para aplicar estilo a un documento XML o HTML para seleccionar elementos en el documento y adjuntar propiedades de estilo a cada elemento seleccionado. En contraste, XSL-FO es un lenguaje para describir un estilo de documento completo, incluyendo la organización de su contenido, estilo, disposición y reglas de selección de la composición, entre ellas la necesidad de formatearlo y paginarlo. Para usarlo, se aplica una hoja de estilo XSLT (stylesheet XSLT) o algún otro mecanismo al documento original XML o XHTML, transformándolo en un documento XSL-FO, lo que se llama alimentar un formateador.

El desarrollo de XSL-FO se debió a 3 razones fundamentales. La primera es que no existía un lenguaje para describir la paginación de documentos complejos en la Web. Todavía hoy, cuando se imprime un documento desde un navegador, la línea de texto que aparece al final de la página, aparece a menudo cortada. Si esto sucede en un dibujo, medio dibujo aparece en la primera página y un espacio en una caja negra aparece en la siguiente página.  CSS-2.0 añadió algún soporte básico para la paginación, pero todavía no ha sido plenamente implementado en los navegadores comunes.  Es más, CSS trabaja solamente con documentos cuyo contenido está organizado de la misma forma que la presentación —no elementos que saltan, ni elementos presentados fuera de secuencia, etc.

La segunda razón es que no existía forma para operar con documentos largos y con composiciones complejas. La Web estándar no soporta cosas como tablas de contenidos, llamadas, notas al pie, notas al final, índices o múltiples artículos en una página, composiciones comunes en periódicos, revistas o páginas de catálogos.

Y la tercera es que el nivel de la tipografía en CSS no bastaba para imprimir documentos, puesto que CSS se limitaba únicamente a las necesidades de los navegadores,  y no era un formato adecuado para la impresión.

Objetivos del Working Group

Así pues, el grupo de trabajo del XSL-WG, estableció un número de objetivos para el diseño de XSLT y XSL-FO:

  •  XSLT y XSL-FO se expresarían en sintaxis pura XML . Esto produciría dos significativas ventajas: XSLT y XSL-FO trabajarían con la existencia de parsers XML, y podrían ser validados y manipulados usando herramientas XML existentes.

  •  XSLT y XSL-FO deberían declarar un conjunto de elementos y atributos plenamente descriptivos para obtener los resultados deseados. (En contraste, un lenguaje de procedimiento o procesado tal como PostScript que describe los algoritmos que producirán el resultado.) Aunque las expresiones de programación están permitidas en algunos atributos, no se requeriría usarlas  y no se requería scripting interna.

  •  XSL se crearía sobre CCS y extendería y aumentaría CSS-2 para cubrir los espacios donde éste no resuelve los problemas. Al mismo tiempo, podría compartir muchas propiedades de estilo y muchos de los modelos de formato y disposición de las CSS. Así pues, XSL incluiría soporte para paginar documentos de gran complejidad, para dotar de estilo a documentos en los que sea muy importante la composición del contenido (tales como libros de texto, manuales, contratos o catálogos industriales), XSL añadiría soporte para características como notas al pie, notas finales, globos, índices, tablas de contenidos, diferentes y homogéneos modelos y plantillas de páginas, etc. También añadiría soporte para documentos de composición reglada como periódicos, revistas, catálogos y folletos. Y, por supuesto, continuaría soportando los documentos navegables que podrían ser soportados usando CSS.

  •  XSL debería cubrir los requerimientos de presentación básica para la mayor parte de usos de impresión y para un gran rango de dispositivos de presentación y visualización, incluyendo reflujo o repaginación para dispositivos de bolsillo ; y para los requerimientos de accesibilidad. Para hacer todo esto, era necesario proveer un mecanismo de transformación que reorganice, filtre el contenido para una mejor presentación para el medio deseado y los requerimientos de acceso. Esto hace necesario separar el diseño de la composición y los controles de paginación secuencia, así como que el mismo estilo de contenido puede ser situado en disposiciones diferentes. El mecanismo de transformación podría proveer una manera para modificar la presentación (estilo y composición) para soportar requerimiento de accesibilidad tales como un texto largo o fuentes alternativas, negro sobre blanco o blanco sobre negro (o alternar esquemas de colores), alternar la navegación y la presentación aural, etc.

  •  XSL-FO mejoraría la tipografía y las características de disposición de los formatos de páginas existentes y sería compatible con los principales modelos de formato. Además, SXL- FO tendría soporte multilingüe incluyendo el uso de Unicode y reglas bidireccionales de Unicode. Soportaría un número de características especiales de composición usadas en Asia y los lenguajes del Medio Este, o que esto fuera fácil de hacer en el futuro. XSL-FO proveería soporte para características multilingües de fuentes de moderna tecnología, tales como fuentes libres.

  •  En adición a los objetivos del proyecto, el Working Group también estableció la necesidad de publicar alguna guía  sobre cómo usar XSL-FO. Lo más importante es que XSL-FO estuviera explícitamente no diseñado para la autoría manual, esto es, que fueran generadas por máquina a través de XSLT, la programación y la composición o las aplicaciones de diseño. Este no era un nuevo concepto, ya que en la publicación dinámica actual de websites se almacena rutinariamente su contenido en XML neutral y entonces las máquinas generan el HTML apropiado para el navegador.

Mucha gente se hace las siguientes preguntas: "Si ya existen las CSS ¿para qué se necesita XSL-FO?” o "Si existen unas maravillosas herramientas de composición WYSIWYG, muchas de las cuales pueden procesar XML, ¿por qué usar XSL-FO?" Además, muchas personas piensan también que las hojas de estilo CSS y XSL son bastante más difíciles y complicadas de escribir que utilizar las agradables interfaces gráficas GUIs de programas de composición tales como FrameMaker o InDesign.

Sin embargo, los requerimientos de la industria de la edición y la publicación son amplios y diversos. Algunos documentos requieren elementos de creación profesional para interactivamente modificar la disposición, el contenido y la tipografía para así obtener un resultado aceptable; otros documentos resultan mejores cuando son generados y formateados bajo demanda usando sistemas basados en reglas. XSL-FO está diseñado para cubrir este agujero en el formato bajo demanda en el sector de la industria; en donde es ideal para productos de colecciones de páginas tales como Adobe Document Server.

Los requerimientos del sector de formato bajo demanda son totalmente diferentes de aquellos diseñados para la interacción, y herramientas de composición WYSIWYG tales como FrameMaker e InDesign. Hoy las herramientas de composición WYSIWYG son muy buenas en la creación y perfeccionamiento de documentos individuales, que es el motor primordial de la existencia de muchas de las publicaciones tradicionales de la industria. En estos productos WYSIWYG, el contenido, el estilo y la composición están estrechamente ligadas al documento y así, mover el documento a un medio alternativo (pantalla versus papel, pantallas con diferentes tamaños o  formatos) es una tarea ardua, complicada y difícil. Otra área donde las herramientas WYSIWYG no son buenas es en la producción de cientos de documentos cuyo contenido está sacado de una base de datos y vertido en documentos a modo de plantillas donde cambian los datos. En estos casos, se necesita que pueda darse a toda la colección de documentos un aspecto común y agradable, y que sea fácil de elaborar.

Existen dos situaciones en las que es mejor operar con software de composición  interactiva: cuando un diseñador necesita control creativo de la disposición, y cuando un escritor o ilustrador necesita trabajar con el contenido mientras simultáneamente ve o modifica esta composición. En la edición de revistas, por ejemplo, el diseño de páginas es en muchos casos complejo y la composición de cada página está hecha a la medida del contenido. (A menudo, ambos, el contenido y la composición, serán ajustados de forma repetida para obtener el resultado deseado.) En la producción de folletos, los gráficos y la composición deben ser producidos al mismo tiempo y los cambios influyen los unos en los otros. También en la producción de periódicos, el contenido está a menudo editado para rellenar un espacio exacto. En estas situaciones, las herramientas de composición interactiva como Adobe InDesign y Adobe InCopy son la elección apropiada.

Sin embargo hay situaciones donde la composición interactiva es imposible. Como ejemplo podemos poner casos en los que la generación del contenido de los documentos viene dada en respuesta a requerimientos individuales (quizás a través del servidor Web) o variaciones de un documento plantilla donde varían algunos campos de datos. En tales situaciones, XSL-FO corriendo en un producto como Adobe Document Server es la elección apropiada.

Otro objetivo importante es imprimir únicamente el contenido que toma gráficos y texto desde las mismas fuentes o recursos de contenido neutro XML que están siendo dinámicamente publicados en la Web. XSL-FO, en conjunción con la especificación XML compañera, XML SVG, ofrece una manera clara para unificar las herramientas de publicación dinámica orientadas a la Web y  la impresión.

Así pues, XSL-FO es un formato intermediario entre el medio XML neutro y el medio dependiente de la salida. Si se alimenta con contenido estructurado XML y una hoja de estilo XSLT a un procesador XSLT, el resultado es XSL-FO. Luego se alimenta XSL-FO, junto con fuentes métricas y algún gráfico o imagen externa, dentro de un formateador XSL-FO, y el resultado es un documento paginado (en PDF o código para imprimir) que puede ser visualizado o impreso.

La siguiente imagen muestra a la perfección el funcionamiento de todo este proceso:

XSL-Fo

Fuente: DEACH, Stephen. "What Is XSL-Fo and When Should I Use It?"
 The Seybold Report . Vol. 2, No. 17. December 9, 2002.
http://www.seyboldreports.com/TSR/free/0217/techwatch.html

En resumen, el lenguaje XSL o Extensible Stylesheet Language abarca una serie de tecnologías que se pueden compendiar de la siguiente forma:

XSLT (XSL Transforms): La palabra “Transforms” muestra exactamente en qué consiste esta parte del estándar pues describe cómo los documentos XML pueden ser filtrados y convertidos en otros documentos XML, incluyendo archivos XSL-FO. Desafortunadamente, un XSLT que especifica este tipo de conversión se denomina hoja de estilo, lo cual crea una gran confusión debido al uso tradicional del término. Una hoja de estilo XSLT es un concepto que encierra una rutina de búsqueda y sustitución más sofisticada que el de las hojas de estilo anteriores.

Xpath (XSL Path Language): Se usa con XSLT para especificar las partes de un documento XML a las cuales se aplica la transformación. Los modelos XPath en documentos XML son un árbol de nodos con padre-hijos y relaciones entre ellos próximas-lejanas. Estos nodos son de diferentes tipos: nodos elemento, nodos atributo, nodos texto, etc. Si XSLT es una herramienta de búsqueda y reemplazo sofisticada, entonces Xpath es la manera para seleccionar qué nodos o tipos de nodos buscar.

XSL-FO (XSL Formatting Objects): El archivo XSL-FO contiene el medio y apariencia específica de los objetos formateados para  fabricar la página (o, para salida de audio, el discurso). Para el medio impreso, los objetos formateados (formatting object) pueden incluir caracteres, bloques de texto, imágenes, tablas, bordes, páginas maestras y otros elemento similares.

XSL-FO no es un lenguaje de descripción de página. Puede especificar varias reglas de composición (por ejemplo, dónde situar una ruptura de página) y requerimientos (por ejemplo, ir a una nota al pie en el final de la página), pero no determina la colocación actual de cada elemento. Esto está determinado por el motor paginador XSL-FO, llamado formateador (formatter).

La salida de un formateador no necesita necesariamente tener asignada una impresora, esto quiere decir que la salida puede ser un archivo PostScript o PDF, que necesitaría un software adicional de interpretación. Hay varios formateadores XSL-FO que se usan comúnmente para generar PDF.


Bibliografía

BOSAK, John (comp.). DSSSL Online Application Profile. http://www.ibiblio.org/pub/sun-info/standards/dsssl/dssslo/dssslo.htm

DEACH, Stephen. "What Is XSL-Fo and When Should I Use It?" The Seybold Report . Vol. 2, No. 17. December 9, 2002. http://www.seyboldreports.com/TSR/free/0217/techwatch.html

PAWSON, Dave. XSL Frequently Asked Questions. http://www.dpawson.co.uk/xsl/xslfaq.html

W3C.Extensible Markup Language XML. http://www.w3.org/TR/REC-xml/

W3C. The Extensible Stylesheet Language Family (XSL). http://www.w3.org/Style/XSL/

W3C. Extensible Stylesheet Language (XSL). http://www.w3.org/TR/xsl/

W3C. How to add style to XML? http://www.w3.org/Style/styling-XML

W3C. Namespaces in XML. http://www.w3.org/TR/REC-xml-names/ (traducción al castellano: POZO, Juan R. Espacios de Nombres en XML. http://html.conclase.net/w3c/xml-names-es/

W3C. Web Style Sheets. Home Page. http://www.w3.org/Style/

W3C. What is XSL? http://www.w3.org/Style/XSL/WhatIsXSL.html

W3C. XML in 10 points. http://www.w3.org/XML/1999/XML-in-10-points.html (traducción al castellano. GUTIÉRREZ RESTREPO, Emmanuelle. XML en 10 puntos. http://www.sidar.org/recur/desdi/traduc/es/xml/xml10p/xml10p.htm)

W3C. XML Path Language (XPath). http://www.w3.org/TR/xpath (traducción al castellano. GÓMEZ DUASO, Juan. XML Path Language (XPath). (http://www.w3.org/TR/xpath) por Sid@r.org: http://www.sidar.org/traduc/xpath.html)

W3C. XML Path Language (XPath) 2.0. http://www.w3.org/TR/xpath20/

W3C. XSL Transformations (XSLT). http://www.w3.org/TR/xslt


 

 Título: Hipertexto, el nuevo concepto de documento en la cultura de la imagen
 Autora: María Jesús Lamarca Lapuente (currículo personal)

 Contacta

 Tesis doctoral. Universidad Complutense de Madrid

 URL: http://www.hipertexto.info

 Fecha de Actualización: 08/12/2013   

 184 páginas web. 2.627 archivos. 2.208 imágenes. Tamaño: 52.406Kb.
 34.389 enlaces (10.436 externos y 23.953 internos)
  

Esta obra está licenciada bajo las siguientes condiciones: 
Creative Commons License
Creative Commons Reconocimiento-NoComercial-NoDerivados-Licencia España 2.5.

 


OTRAS PÁGINAS DE LA AUTORA
 

           Blog El Cultural a la PuertaBlog El Cultural a la Puerta:: http://puertadetoledo.blogspot.com/ 

                                                                                                                AGETECA. Base de Datos de Gestión Cultural
                                                                                                                 Ageteca. Base de Datos de Gestión Cultural:
      
                                                                                                    http://www.agetec.org/ageteca

Fundación Ricardo Lamarca, ajedrez y cultura

Fundación Ricardo Lamarca, Ajedrez y cultura http://www.fundacionlamarca.es

 

 

La artesa digital

Blog La artesa digital
http://artesadigital.blogspot.com.es

Especial Poesía: Hasta allí hemos llegado

Blog La artesa digital Flickr La artes@ digital: Galería de fotos mundo
 digital y mundo analógico: http://www.flickr.com/photos/artesadigital/

Blog miembras

Blog Miembras: usos lingüísticos, políticos y sociales del lenguajeBlog Miembras: Usos lingüísticos, políticos
 y sociales del lenguaje http://miembras.blogspot.com

 

Mapa de navegación / Tabla de contenido / Mapa conceptual / Tabla de documentos / Buscador / Bibliografía utilizada / Glosario de Términos / Índice Temático / Índice de Autores