SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Transformación documentos
XML
Jose Emilio Labra Gayo
Departamento de Informática
Universidad de Oviedo
Hojas de estilos para XML
Antecedentes
SGML tenía DSSSL (Document Style Semantics and
Specification Language)
Para XML se optó por crear XSL (XML Stylesheet
Language)
Posteriormente se dividió en 3 partes:
XSLT: Transformación de documentos XML
XPath: Especificar caminos y expresiones XML
XSL-FO: Objetos de formateo
XSLT
Lenguaje de plantillas
Recorre el árbol recursivamente encajando plantillas
Version 1.0 (1999)
Versión más popular
Incluido en navegadores
Versión 2.0 (2007)
Basada en Xpath 2.0
Facilidades para agrupación y tipos de datos
Creación de funciones
Múltiples documentos de salida
Problema: No soportada en navegadores ni en algunos sistemas
Versión 3.0 (en desarrollo)
vacia.xsl
Estructura básica de XSLT
Espacio de nombres
http://www.w3.org/1999/XSL/Transform
Elemento raíz: stylesheet
Aunque no se definan plantillas, se recorre el árbol,
mostrando elementos por defecto
Ejemplo: Hoja de estilos vacía:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--…plantillas… -->
</xsl:stylesheet>
xsltproc vacia.xsl documento.xml
Ejemplo de generación de HTML
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h1>Pedido</h1>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="producto">
<p><xsl:value-of select="nombre" /></p>
</xsl:template>
</xsl:stylesheet>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
<html>
<body>
<h1>Pedido</h1>
<p>Grapadora</p>
<p>Rotulador</p>
</body>
</html>
Lenguaje XSLT
Lenguaje declarativo basado en plantillas: “templates”
Varias plantillas predefinidas: recorren el árbol
mostrando los elementos
Una transformación se basa en declarar nuevas plantillas
Encaje de plantillas
El atributo match de una plantilla es una expresión XPath
Funcionamiento:
El procesador recorre el árbol
Si encuentra una plantilla que encaja con el nodo actual
Mete los elementos que hay dentro de la plantilla en la salida
<xsl:template match="/">
<html>
<body>
<h1>Pedido</h1>
</body>
</html>
</xsl:template>
Aplicando plantillas
“apply-templates” indica al procesador que continúe
aplicando plantillas
Por defecto, continúa recursivamente a partir del nodo actual
Mediante el atributo select se pueden otras partes del árbol
El atributo select toma una expresión XPath
<xsl:template match="/">
<html>
<body>
<h1>Pedido</h1>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<h1>Pedido</h1>
<xsl:apply-templates select=“//producto[2]”/>
</body>
</html>
</xsl:template>
Obteniendo valores
“value-of” permite obtener un valor
El valor a obtener se indica mediante el atributo select
Admite cualquier una expresión XPath
<xsl:template match="producto">
<p>
<xsl:value-of select="nombre" />
</p>
</xsl:template>
<xsl:template match="producto">
<p>
<xsl:value-of select="nombre" />,
<xsl:value-of select="@codigo" />
</p>
</xsl:template>
Asociar XSLT a XML
En un documento XML se puede incluir:
<?xml-stylesheet
type="text/xsl"
href="documento.xsl" ?>
Transforma el documento "al vuelo" en el navegador
NOTA: Chrome no realiza la transformación en ficheros
locales por motivos de seguridad
Modos de recorrido
Mediante el atributo “mode” se pueden indicar diferentes
modos de recorrido
Útil para generar tablas de contenido
<xsl:template match="/">
<html>
<body>
<h1>Pedido</h1>
<p>Productos:
<xsl:apply-templates mode="nombres" />
</p>
<h2>Detalle</h2>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="producto"
mode="nombres">
<xsl:value-of select="nombre" /> |
</xsl:template>
<xsl:template match="producto">
<p><xsl:value-of select="nombre" />,
<xsl:value-of select="@codigo" />,
<xsl:value-of select="cantidad" />
</p>
</xsl:template>
Plantillas predefinidas
Las plantillas predefinidas recorren el árbol y muestran el
texto y ignorando el resto
<xsl:template match="text()|@*">
<xsl:value-of select="." />
</xsl:template>
<xsl:template match="*|/">
<xsl:value-of apply-templates />
</xsl:template>
<xsl:template match="processing-instruction()
|comment()"
/>
Nodos de texto y atributos:
los muestra
Elementos y nodo raíz:
Continúa recorrido recursivo
Comentarios e instrucciones
de procesamiento:
los ignora
Árbol de resultado
XSLT va generando un árbol de resultado
Se incluyen todos los elementos de un espacio de
nombres distinto al de XSLT
Se añaden las declaraciones de espacios de nombres
correspondientes
Se puede controlar el proceso mediante:
exclude-result-prefixes:
namespace-alias
extension-element-prefixes
xsl:output permite indicar el tipo de salida
method puede ser "xml", "html", "text"
encoding indica el tipo de codificación
Transformar XML a XML
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" />
<xsl:template match="/">
<codigos>
<xsl:apply-templates />
</codigos>
</xsl:template>
<xsl:template match="producto">
<codigo>
<xsl:value-of select="@codigo" />
</codigo>
</xsl:template>
</xsl:stylesheet>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
<codigos>
<codigo>G23</codigo>
<codigo>R15</codigo>
</codigos>
Transformar XML a Texto (CSV)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="producto">
<xsl:value-of select="@codigo"
/>,<xsl:value-of select="nombre"
/>,<xsl:value-of select="cantidad" />
</xsl:template>
</xsl:stylesheet>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
G23,Grapadora,20
R15,Rotulador,10
De XML a Gráficos vectoriales (SVG)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:svg="http://www.w3.org/2000/svg">
<xsl:template match="/">
<svg:svg><xsl:apply-templates /></svg:svg>
</xsl:template>
<xsl:template match="producto">
<svg:text y="{position()*20}" x="10" font-size="20">
<xsl:value-of select="nombre" />
</svg:text>
<svg:rect y="{position()*20-10}" x="100"
width="{cantidad * 10}" height="10" fill="blue"/>
</xsl:template>
</xsl:stylesheet>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
De XML a PDF (a través de FO)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
<fo:root><fo:layout-master-set>
<fo:simple-page-master master-name="maestro">
<fo:region-body margin="2cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="maestro">
<fo:flow flow-name="xsl-region-body">
<xsl:apply-templates />
</fo:flow>
</fo:page-sequence>
</fo:root></xsl:template>
<xsl:template match="producto">
<fo:block><xsl:value-of select="nombre" /></fo:block>
</xsl:template>
</xsl:stylesheet>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
Grapadora
Rotulador
Requiere procesador de XSL-FO
Creación de elementos
2 formas
<xsl:template match="producto">
<p>
<xsl:value-of select="nombre" />
</p>
</xsl:template>
<xsl:template match="producto">
<xsl:element name="p">
<xsl:value-of select="nombre" />
</xsl:element>
</xsl:template>
Inclusión literal
Mediante
xsl:element
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<p> Grapadora</p>
Creación de atributos
2 formas
<xsl:template match="producto">
<p id="{@codigo}">
<xsl:value-of select="nombre" />
</p>
</xsl:template>
<xsl:template match="producto">
<p>
<xsl:attribute name="id">
<xsl:value-of select="@codigo" />
</xsl:attribute>
<xsl:value-of select="nombre" />
</p>
</xsl:template>
Mediante { }
Mediante
xsl:element
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<p id="G23">Grapadora</p>
Creación de texto
Mediante xsl:text
<xsl:template match="producto">
<p>
<xsl:value-of select="nombre" />
<xsl:text> </xsl:text>
<xsl:value-of select="cantidad" />
</p>
</xsl:template>
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<p>
Grapadora 20
</p>
Creación de comentarios
Mediante xsl:comment
<xsl:template match="producto">
<xsl:comment>
Identificador: <xsl:value-of select="@codigo" />
</xsl:comment>
<p>
<xsl:value-of select="nombre" />
</p>
</xsl:template>
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<!-- Identificador: G23 -->
<p>
Grapadora
</p>
Creación de Instrucciones de procesamiento
Mediante xsl:processing-instruction
<xsl:template match="producto">
<xsl:processing-instruction name="PROD">
<xsl:value-of select="@codigo" />
</xsl:processing-instruction>
<p>
<xsl:value-of select="nombre" />
</p>
</xsl:template>
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<?PROD G23>
<p>
Grapadora
</p>
Copiar contenido
2 formas
xsl:copy: copia un nodo
xsl:copy-of: copia un fragmento del árbol
<xsl:template match="producto">
<item>
<xsl:copy-of select="." />
</item>
</xsl:template>
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<item>
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
</item>
Condicional: if
Mediante xsl:if se pueden indicar condiciones
<xsl:template match="producto">
<p>
<xsl:value-of select="nombre" />.
<xsl:if test="cantidad &gt; 15">
Superior a 15
</xsl:if>
</p>
</xsl:template>
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<p>
Grapadora. Superior a 15
</p>
Condicional: choose
xsl:choose permite definir varias condiciones
<xsl:template match="producto">
<p>
<xsl:value-of select="nombre" />.
<xsl:choose>
<xsl:when test="cantidad &gt; 15">
Superior a 15
</xsl:when>
<xsl:when test="cantidad &gt;= 1">
Entre 1 y 15
</xsl:when>
<xsl:otherwise>
Cantidad incorrecta
</xsl:otherwise>
</xsl:choose>
</p>
</xsl:template>
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<p>
Grapadora. Superior a 15
</p>
Repetición: for-each
xsl:for-each repite el procesamiento sobre un conjunto
<xsl:template match="/">
<codigos>
<xsl:for-each select="//producto">
<codigo>
<xsl:value-of select="@codigo" />
</codigo>
</xsl:for-each>
</codigos>
</xsl:template>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
<codigos>
<codigo>G23</codigo>
<codigo>R15</codigo>
</codigos>
Variables
Mediante xsl:variable pueden declararse variables
Se accede mediante $vble
Los valores de las variables no pueden modificarse
XSLT = Lenguaje declarativo
<xsl:template match="/">
<xsl:variable name="total"
select="sum(//cantidad)" />
<pedido>
<xsl:for-each select="//producto">
<producto>
<xsl:value-of select="@codigo" />.
<xsl:value-of select="cantidad" /> de
<xsl:value-of select="$total" />.
</producto>
</xsl:for-each>
</pedido>
</xsl:template>
</xsl:stylesheet>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
<pedido>
<producto>G23. 20 de 30</producto>
<producto>R15. 10 de 30</producto>
</pedido>
Parámetros
Se declaran con xsl:param
Toman valores por defecto que pueden alterarse en la invocación
Similares a las variables
<xsl:param name="ponerTotal">SI</xsl:param>
<xsl:template match="/">
<xsl:if test="$ponerTotal = 'SI'">
Total = <xsl:value-of select='sum(//cantidad)' />
</xsl:if>
…continuar procesando
</xsl:template>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
Total = 30
…continuar procesando
Plantillas con nombre
Similares a funciones que pueden ser invocadas
<xsl:template match="/">
<xsl:call-template name="suma">
<xsl:with-param name="a" select="2" />
<xsl:with-param name="b" select="3" />
</xsl:call-template>
</xsl:template>
<xsl:template name="suma">
<xsl:param name="a" />
<xsl:param name="b" />
<xsl:value-of select="$a + $b" />
</xsl:template>
…cualquier documento XML
5
Recursividad
Es posible realizar invocaciones recursivas
XSLT = lenguaje Turing completo
<xsl:template name="factorial">
<xsl:param name="n" />
<xsl:choose>
<xsl:when test="$n = 0">1</xsl:when>
<xsl:otherwise>
<xsl:variable name="f">
<xsl:call-template name="factorial">
<xsl:with-param name="n" select="$n - 1" />
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$n * $f" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
En otro lenguaje sería:
def factorial(n)
if n == 0
1
else
f = factorial (n-1)
n * f
end
end
Ordenación
xsl:sort permite ordenar los resultados
<xsl:template match="/">
<codigos>
<xsl:for-each select="//producto">
<xsl:sort data-type="number"
select="cantidad"
order="ascending" />
<codigo>
<xsl:value-of select="@codigo" />
</codigo>
</xsl:for-each>
</codigos>
</xsl:template>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
<codigos>
<codigo>R15</codigo>
<codigo>G23</codigo>
</codigos>
Numeración automática
xsl:number permite insertar numeración automática
Es posible modificar el formato del número
<xsl:template match="/">
<codigos>
<xsl:for-each select="//producto">
<codigo>
<xsl:number />.-
<xsl:value-of select="nombre" />
</codigo>
</xsl:for-each>
</codigos>
</xsl:template>
<pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
<codigos>
<codigo>1.-Grapadora</codigo>
<codigo>2.-Rotulador</codigo>
</codigos>
Acceso a otros documentos
La función document permite acceder a otros
documentos XML
<xsl:template match="/">
<xsl:for-each select="//producto">
<xsl:variable name="cod" select="@codigo" />
<xsl:value-of select="nombre" />,
<xsl:value-of select="document('precios.xml')//producto[@codigo = $cod]/@precio" />
</xsl:for-each>
</xsl:template> <pedido fecha="3/2/2011">
<producto codigo="G23">
<nombre>Grapadora</nombre>
<cantidad>20</cantidad>
</producto>
<producto codigo="R15">
<nombre>Rotulador</nombre>
<cantidad>10</cantidad>
</producto>
</pedido>
<codigos>
<codigo>G23, 15</codigo>
<codigo>R15, 6</codigo>
</codigos>
<precios>
<producto codigo="R15" precio="6" />
<producto codigo="G23" precio="15" />
<producto codigo="S56" precio="26" />
</precios>
precios.xml
Valoración de XSLT
Es un lenguaje de programación Turing-completo
Lenguaje declarativo (sin asignación destructiva)
4 tipos de datos (enteros, booleanos, strings y conjuntos de nodos
Sin chequeo estático de tipos
¿Seguridad? ¿Eficiencia? (no son objetivos de diseño)
XSLT 2.0 pretende incluir tipos de datos de XML Schema
Flexible: La sintaxis de XPath se adapta a posibles cambios en la estructura.
No se valida el documento
Bueno para hacer tareas sencillas rápidamente
Empotrado en navegadores
Los programas XSLT son documentos XML
La sintaxis es poco amigable para el programador
Necesidad de buenas herramientas de autor

Weitere ähnliche Inhalte

Was ist angesagt? (20)

CSS Introduction
CSS IntroductionCSS Introduction
CSS Introduction
 
Html form tag
Html form tagHtml form tag
Html form tag
 
HTML5 Form Validation
HTML5 Form ValidationHTML5 Form Validation
HTML5 Form Validation
 
XSLT
XSLTXSLT
XSLT
 
WSDL
WSDLWSDL
WSDL
 
Html ppt
Html pptHtml ppt
Html ppt
 
Xml
XmlXml
Xml
 
Html 5-tables-forms-frames (1)
Html 5-tables-forms-frames (1)Html 5-tables-forms-frames (1)
Html 5-tables-forms-frames (1)
 
Html tables, forms and audio video
Html tables, forms and audio videoHtml tables, forms and audio video
Html tables, forms and audio video
 
CSS
CSSCSS
CSS
 
MYSQL
MYSQLMYSQL
MYSQL
 
Xpath presentation
Xpath presentationXpath presentation
Xpath presentation
 
HTML 5 Complete Reference
HTML 5 Complete ReferenceHTML 5 Complete Reference
HTML 5 Complete Reference
 
Excel tutorial
Excel tutorialExcel tutorial
Excel tutorial
 
Html frames
Html framesHtml frames
Html frames
 
Document Object Model
Document Object ModelDocument Object Model
Document Object Model
 
html5.ppt
html5.ppthtml5.ppt
html5.ppt
 
Form validation client side
Form validation client side Form validation client side
Form validation client side
 
Introduction to XML
Introduction to XMLIntroduction to XML
Introduction to XML
 
Beginners css tutorial for web designers
Beginners css tutorial for web designersBeginners css tutorial for web designers
Beginners css tutorial for web designers
 

Ähnlich wie XSLT

Ähnlich wie XSLT (20)

XSLT y XPATH
XSLT y XPATHXSLT y XPATH
XSLT y XPATH
 
U7 1 xslt-curso2017-18
U7 1 xslt-curso2017-18U7 1 xslt-curso2017-18
U7 1 xslt-curso2017-18
 
Oracle xmldb
Oracle xmldbOracle xmldb
Oracle xmldb
 
Xml
XmlXml
Xml
 
Introducción a XML: Sintaxis y documentos bien formados
Introducción a XML: Sintaxis y documentos bien formadosIntroducción a XML: Sintaxis y documentos bien formados
Introducción a XML: Sintaxis y documentos bien formados
 
05 . generacion de vista con plantillas twirl en play framework
05 .  generacion de vista con plantillas twirl en play framework05 .  generacion de vista con plantillas twirl en play framework
05 . generacion de vista con plantillas twirl en play framework
 
Curso xml
Curso xmlCurso xml
Curso xml
 
XML - Introducción
XML - IntroducciónXML - Introducción
XML - Introducción
 
XQuery y XPath for SQL Server 2012 itpros dc_chapter6
XQuery y XPath for SQL Server 2012 itpros dc_chapter6XQuery y XPath for SQL Server 2012 itpros dc_chapter6
XQuery y XPath for SQL Server 2012 itpros dc_chapter6
 
05 desarrollocss (3)
05 desarrollocss (3)05 desarrollocss (3)
05 desarrollocss (3)
 
Introducción a XML Schema
Introducción a XML SchemaIntroducción a XML Schema
Introducción a XML Schema
 
Datos En La Web - Clase 2
Datos En La Web - Clase 2Datos En La Web - Clase 2
Datos En La Web - Clase 2
 
XML: Ejemplos de uso
XML: Ejemplos de usoXML: Ejemplos de uso
XML: Ejemplos de uso
 
Omar unidad 07 base de datos
Omar unidad 07 base de datosOmar unidad 07 base de datos
Omar unidad 07 base de datos
 
Lectura de un archivo xml de manera local en wp
Lectura de un archivo xml de manera local en wpLectura de un archivo xml de manera local en wp
Lectura de un archivo xml de manera local en wp
 
Almdedat
AlmdedatAlmdedat
Almdedat
 
LM-UT6: Transformaciones XML
LM-UT6: Transformaciones XML LM-UT6: Transformaciones XML
LM-UT6: Transformaciones XML
 
Arquitectura del Web 2
Arquitectura del Web 2Arquitectura del Web 2
Arquitectura del Web 2
 
Xml
XmlXml
Xml
 
Documento de referencia XHTML + CSS + JAVASCRIPT
Documento de referencia XHTML + CSS + JAVASCRIPTDocumento de referencia XHTML + CSS + JAVASCRIPT
Documento de referencia XHTML + CSS + JAVASCRIPT
 

Mehr von Jose Emilio Labra Gayo

Introducción a la investigación/doctorado
Introducción a la investigación/doctoradoIntroducción a la investigación/doctorado
Introducción a la investigación/doctoradoJose Emilio Labra Gayo
 
Challenges and applications of RDF shapes
Challenges and applications of RDF shapesChallenges and applications of RDF shapes
Challenges and applications of RDF shapesJose Emilio Labra Gayo
 
Legislative data portals and linked data quality
Legislative data portals and linked data qualityLegislative data portals and linked data quality
Legislative data portals and linked data qualityJose Emilio Labra Gayo
 
Validating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesValidating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesJose Emilio Labra Gayo
 
Legislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesLegislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesJose Emilio Labra Gayo
 
Como publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosComo publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosJose Emilio Labra Gayo
 
Arquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorArquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorJose Emilio Labra Gayo
 

Mehr von Jose Emilio Labra Gayo (20)

Publicaciones de investigación
Publicaciones de investigaciónPublicaciones de investigación
Publicaciones de investigación
 
Introducción a la investigación/doctorado
Introducción a la investigación/doctoradoIntroducción a la investigación/doctorado
Introducción a la investigación/doctorado
 
Challenges and applications of RDF shapes
Challenges and applications of RDF shapesChallenges and applications of RDF shapes
Challenges and applications of RDF shapes
 
Legislative data portals and linked data quality
Legislative data portals and linked data qualityLegislative data portals and linked data quality
Legislative data portals and linked data quality
 
Validating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesValidating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectives
 
Wikidata
WikidataWikidata
Wikidata
 
Legislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesLegislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologies
 
ShEx by Example
ShEx by ExampleShEx by Example
ShEx by Example
 
Introduction to SPARQL
Introduction to SPARQLIntroduction to SPARQL
Introduction to SPARQL
 
Introducción a la Web Semántica
Introducción a la Web SemánticaIntroducción a la Web Semántica
Introducción a la Web Semántica
 
RDF Data Model
RDF Data ModelRDF Data Model
RDF Data Model
 
2017 Tendencias en informática
2017 Tendencias en informática2017 Tendencias en informática
2017 Tendencias en informática
 
RDF, linked data and semantic web
RDF, linked data and semantic webRDF, linked data and semantic web
RDF, linked data and semantic web
 
Introduction to SPARQL
Introduction to SPARQLIntroduction to SPARQL
Introduction to SPARQL
 
19 javascript servidor
19 javascript servidor19 javascript servidor
19 javascript servidor
 
Como publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosComo publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazados
 
16 Alternativas XML
16 Alternativas XML16 Alternativas XML
16 Alternativas XML
 
XPath
XPathXPath
XPath
 
Arquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorArquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el Servidor
 
RDF validation tutorial
RDF validation tutorialRDF validation tutorial
RDF validation tutorial
 

XSLT

  • 1. Transformación documentos XML Jose Emilio Labra Gayo Departamento de Informática Universidad de Oviedo
  • 2. Hojas de estilos para XML Antecedentes SGML tenía DSSSL (Document Style Semantics and Specification Language) Para XML se optó por crear XSL (XML Stylesheet Language) Posteriormente se dividió en 3 partes: XSLT: Transformación de documentos XML XPath: Especificar caminos y expresiones XML XSL-FO: Objetos de formateo
  • 3. XSLT Lenguaje de plantillas Recorre el árbol recursivamente encajando plantillas Version 1.0 (1999) Versión más popular Incluido en navegadores Versión 2.0 (2007) Basada en Xpath 2.0 Facilidades para agrupación y tipos de datos Creación de funciones Múltiples documentos de salida Problema: No soportada en navegadores ni en algunos sistemas Versión 3.0 (en desarrollo)
  • 4. vacia.xsl Estructura básica de XSLT Espacio de nombres http://www.w3.org/1999/XSL/Transform Elemento raíz: stylesheet Aunque no se definan plantillas, se recorre el árbol, mostrando elementos por defecto Ejemplo: Hoja de estilos vacía: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!--…plantillas… --> </xsl:stylesheet> xsltproc vacia.xsl documento.xml
  • 5. Ejemplo de generación de HTML <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <h1>Pedido</h1> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="producto"> <p><xsl:value-of select="nombre" /></p> </xsl:template> </xsl:stylesheet> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> <html> <body> <h1>Pedido</h1> <p>Grapadora</p> <p>Rotulador</p> </body> </html>
  • 6. Lenguaje XSLT Lenguaje declarativo basado en plantillas: “templates” Varias plantillas predefinidas: recorren el árbol mostrando los elementos Una transformación se basa en declarar nuevas plantillas
  • 7. Encaje de plantillas El atributo match de una plantilla es una expresión XPath Funcionamiento: El procesador recorre el árbol Si encuentra una plantilla que encaja con el nodo actual Mete los elementos que hay dentro de la plantilla en la salida <xsl:template match="/"> <html> <body> <h1>Pedido</h1> </body> </html> </xsl:template>
  • 8. Aplicando plantillas “apply-templates” indica al procesador que continúe aplicando plantillas Por defecto, continúa recursivamente a partir del nodo actual Mediante el atributo select se pueden otras partes del árbol El atributo select toma una expresión XPath <xsl:template match="/"> <html> <body> <h1>Pedido</h1> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="/"> <html> <body> <h1>Pedido</h1> <xsl:apply-templates select=“//producto[2]”/> </body> </html> </xsl:template>
  • 9. Obteniendo valores “value-of” permite obtener un valor El valor a obtener se indica mediante el atributo select Admite cualquier una expresión XPath <xsl:template match="producto"> <p> <xsl:value-of select="nombre" /> </p> </xsl:template> <xsl:template match="producto"> <p> <xsl:value-of select="nombre" />, <xsl:value-of select="@codigo" /> </p> </xsl:template>
  • 10. Asociar XSLT a XML En un documento XML se puede incluir: <?xml-stylesheet type="text/xsl" href="documento.xsl" ?> Transforma el documento "al vuelo" en el navegador NOTA: Chrome no realiza la transformación en ficheros locales por motivos de seguridad
  • 11. Modos de recorrido Mediante el atributo “mode” se pueden indicar diferentes modos de recorrido Útil para generar tablas de contenido <xsl:template match="/"> <html> <body> <h1>Pedido</h1> <p>Productos: <xsl:apply-templates mode="nombres" /> </p> <h2>Detalle</h2> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="producto" mode="nombres"> <xsl:value-of select="nombre" /> | </xsl:template> <xsl:template match="producto"> <p><xsl:value-of select="nombre" />, <xsl:value-of select="@codigo" />, <xsl:value-of select="cantidad" /> </p> </xsl:template>
  • 12. Plantillas predefinidas Las plantillas predefinidas recorren el árbol y muestran el texto y ignorando el resto <xsl:template match="text()|@*"> <xsl:value-of select="." /> </xsl:template> <xsl:template match="*|/"> <xsl:value-of apply-templates /> </xsl:template> <xsl:template match="processing-instruction() |comment()" /> Nodos de texto y atributos: los muestra Elementos y nodo raíz: Continúa recorrido recursivo Comentarios e instrucciones de procesamiento: los ignora
  • 13. Árbol de resultado XSLT va generando un árbol de resultado Se incluyen todos los elementos de un espacio de nombres distinto al de XSLT Se añaden las declaraciones de espacios de nombres correspondientes Se puede controlar el proceso mediante: exclude-result-prefixes: namespace-alias extension-element-prefixes xsl:output permite indicar el tipo de salida method puede ser "xml", "html", "text" encoding indica el tipo de codificación
  • 14. Transformar XML a XML <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" /> <xsl:template match="/"> <codigos> <xsl:apply-templates /> </codigos> </xsl:template> <xsl:template match="producto"> <codigo> <xsl:value-of select="@codigo" /> </codigo> </xsl:template> </xsl:stylesheet> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> <codigos> <codigo>G23</codigo> <codigo>R15</codigo> </codigos>
  • 15. Transformar XML a Texto (CSV) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" /> <xsl:template match="producto"> <xsl:value-of select="@codigo" />,<xsl:value-of select="nombre" />,<xsl:value-of select="cantidad" /> </xsl:template> </xsl:stylesheet> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> G23,Grapadora,20 R15,Rotulador,10
  • 16. De XML a Gráficos vectoriales (SVG) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:svg="http://www.w3.org/2000/svg"> <xsl:template match="/"> <svg:svg><xsl:apply-templates /></svg:svg> </xsl:template> <xsl:template match="producto"> <svg:text y="{position()*20}" x="10" font-size="20"> <xsl:value-of select="nombre" /> </svg:text> <svg:rect y="{position()*20-10}" x="100" width="{cantidad * 10}" height="10" fill="blue"/> </xsl:template> </xsl:stylesheet> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido>
  • 17. De XML a PDF (a través de FO) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"> <xsl:template match="/"> <fo:root><fo:layout-master-set> <fo:simple-page-master master-name="maestro"> <fo:region-body margin="2cm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="maestro"> <fo:flow flow-name="xsl-region-body"> <xsl:apply-templates /> </fo:flow> </fo:page-sequence> </fo:root></xsl:template> <xsl:template match="producto"> <fo:block><xsl:value-of select="nombre" /></fo:block> </xsl:template> </xsl:stylesheet> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> Grapadora Rotulador Requiere procesador de XSL-FO
  • 18. Creación de elementos 2 formas <xsl:template match="producto"> <p> <xsl:value-of select="nombre" /> </p> </xsl:template> <xsl:template match="producto"> <xsl:element name="p"> <xsl:value-of select="nombre" /> </xsl:element> </xsl:template> Inclusión literal Mediante xsl:element <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <p> Grapadora</p>
  • 19. Creación de atributos 2 formas <xsl:template match="producto"> <p id="{@codigo}"> <xsl:value-of select="nombre" /> </p> </xsl:template> <xsl:template match="producto"> <p> <xsl:attribute name="id"> <xsl:value-of select="@codigo" /> </xsl:attribute> <xsl:value-of select="nombre" /> </p> </xsl:template> Mediante { } Mediante xsl:element <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <p id="G23">Grapadora</p>
  • 20. Creación de texto Mediante xsl:text <xsl:template match="producto"> <p> <xsl:value-of select="nombre" /> <xsl:text> </xsl:text> <xsl:value-of select="cantidad" /> </p> </xsl:template> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <p> Grapadora 20 </p>
  • 21. Creación de comentarios Mediante xsl:comment <xsl:template match="producto"> <xsl:comment> Identificador: <xsl:value-of select="@codigo" /> </xsl:comment> <p> <xsl:value-of select="nombre" /> </p> </xsl:template> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <!-- Identificador: G23 --> <p> Grapadora </p>
  • 22. Creación de Instrucciones de procesamiento Mediante xsl:processing-instruction <xsl:template match="producto"> <xsl:processing-instruction name="PROD"> <xsl:value-of select="@codigo" /> </xsl:processing-instruction> <p> <xsl:value-of select="nombre" /> </p> </xsl:template> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <?PROD G23> <p> Grapadora </p>
  • 23. Copiar contenido 2 formas xsl:copy: copia un nodo xsl:copy-of: copia un fragmento del árbol <xsl:template match="producto"> <item> <xsl:copy-of select="." /> </item> </xsl:template> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <item> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> </item>
  • 24. Condicional: if Mediante xsl:if se pueden indicar condiciones <xsl:template match="producto"> <p> <xsl:value-of select="nombre" />. <xsl:if test="cantidad &gt; 15"> Superior a 15 </xsl:if> </p> </xsl:template> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <p> Grapadora. Superior a 15 </p>
  • 25. Condicional: choose xsl:choose permite definir varias condiciones <xsl:template match="producto"> <p> <xsl:value-of select="nombre" />. <xsl:choose> <xsl:when test="cantidad &gt; 15"> Superior a 15 </xsl:when> <xsl:when test="cantidad &gt;= 1"> Entre 1 y 15 </xsl:when> <xsl:otherwise> Cantidad incorrecta </xsl:otherwise> </xsl:choose> </p> </xsl:template> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <p> Grapadora. Superior a 15 </p>
  • 26. Repetición: for-each xsl:for-each repite el procesamiento sobre un conjunto <xsl:template match="/"> <codigos> <xsl:for-each select="//producto"> <codigo> <xsl:value-of select="@codigo" /> </codigo> </xsl:for-each> </codigos> </xsl:template> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> <codigos> <codigo>G23</codigo> <codigo>R15</codigo> </codigos>
  • 27. Variables Mediante xsl:variable pueden declararse variables Se accede mediante $vble Los valores de las variables no pueden modificarse XSLT = Lenguaje declarativo <xsl:template match="/"> <xsl:variable name="total" select="sum(//cantidad)" /> <pedido> <xsl:for-each select="//producto"> <producto> <xsl:value-of select="@codigo" />. <xsl:value-of select="cantidad" /> de <xsl:value-of select="$total" />. </producto> </xsl:for-each> </pedido> </xsl:template> </xsl:stylesheet> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> <pedido> <producto>G23. 20 de 30</producto> <producto>R15. 10 de 30</producto> </pedido>
  • 28. Parámetros Se declaran con xsl:param Toman valores por defecto que pueden alterarse en la invocación Similares a las variables <xsl:param name="ponerTotal">SI</xsl:param> <xsl:template match="/"> <xsl:if test="$ponerTotal = 'SI'"> Total = <xsl:value-of select='sum(//cantidad)' /> </xsl:if> …continuar procesando </xsl:template> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> Total = 30 …continuar procesando
  • 29. Plantillas con nombre Similares a funciones que pueden ser invocadas <xsl:template match="/"> <xsl:call-template name="suma"> <xsl:with-param name="a" select="2" /> <xsl:with-param name="b" select="3" /> </xsl:call-template> </xsl:template> <xsl:template name="suma"> <xsl:param name="a" /> <xsl:param name="b" /> <xsl:value-of select="$a + $b" /> </xsl:template> …cualquier documento XML 5
  • 30. Recursividad Es posible realizar invocaciones recursivas XSLT = lenguaje Turing completo <xsl:template name="factorial"> <xsl:param name="n" /> <xsl:choose> <xsl:when test="$n = 0">1</xsl:when> <xsl:otherwise> <xsl:variable name="f"> <xsl:call-template name="factorial"> <xsl:with-param name="n" select="$n - 1" /> </xsl:call-template> </xsl:variable> <xsl:value-of select="$n * $f" /> </xsl:otherwise> </xsl:choose> </xsl:template> En otro lenguaje sería: def factorial(n) if n == 0 1 else f = factorial (n-1) n * f end end
  • 31. Ordenación xsl:sort permite ordenar los resultados <xsl:template match="/"> <codigos> <xsl:for-each select="//producto"> <xsl:sort data-type="number" select="cantidad" order="ascending" /> <codigo> <xsl:value-of select="@codigo" /> </codigo> </xsl:for-each> </codigos> </xsl:template> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> <codigos> <codigo>R15</codigo> <codigo>G23</codigo> </codigos>
  • 32. Numeración automática xsl:number permite insertar numeración automática Es posible modificar el formato del número <xsl:template match="/"> <codigos> <xsl:for-each select="//producto"> <codigo> <xsl:number />.- <xsl:value-of select="nombre" /> </codigo> </xsl:for-each> </codigos> </xsl:template> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> <codigos> <codigo>1.-Grapadora</codigo> <codigo>2.-Rotulador</codigo> </codigos>
  • 33. Acceso a otros documentos La función document permite acceder a otros documentos XML <xsl:template match="/"> <xsl:for-each select="//producto"> <xsl:variable name="cod" select="@codigo" /> <xsl:value-of select="nombre" />, <xsl:value-of select="document('precios.xml')//producto[@codigo = $cod]/@precio" /> </xsl:for-each> </xsl:template> <pedido fecha="3/2/2011"> <producto codigo="G23"> <nombre>Grapadora</nombre> <cantidad>20</cantidad> </producto> <producto codigo="R15"> <nombre>Rotulador</nombre> <cantidad>10</cantidad> </producto> </pedido> <codigos> <codigo>G23, 15</codigo> <codigo>R15, 6</codigo> </codigos> <precios> <producto codigo="R15" precio="6" /> <producto codigo="G23" precio="15" /> <producto codigo="S56" precio="26" /> </precios> precios.xml
  • 34. Valoración de XSLT Es un lenguaje de programación Turing-completo Lenguaje declarativo (sin asignación destructiva) 4 tipos de datos (enteros, booleanos, strings y conjuntos de nodos Sin chequeo estático de tipos ¿Seguridad? ¿Eficiencia? (no son objetivos de diseño) XSLT 2.0 pretende incluir tipos de datos de XML Schema Flexible: La sintaxis de XPath se adapta a posibles cambios en la estructura. No se valida el documento Bueno para hacer tareas sencillas rápidamente Empotrado en navegadores Los programas XSLT son documentos XML La sintaxis es poco amigable para el programador Necesidad de buenas herramientas de autor