SlideShare une entreprise Scribd logo
1  sur  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

Contenu connexe

Tendances

Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endModularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endMario Guedes
 
01. Pengenalan Web Server Dan Sss
01. Pengenalan Web Server Dan Sss01. Pengenalan Web Server Dan Sss
01. Pengenalan Web Server Dan SssAchmad Solichin
 
Java Web Programming [1/9] : Introduction to Web Application
Java Web Programming [1/9] : Introduction to Web ApplicationJava Web Programming [1/9] : Introduction to Web Application
Java Web Programming [1/9] : Introduction to Web ApplicationIMC Institute
 
Polymorphic Table Functions in SQL
Polymorphic Table Functions in SQLPolymorphic Table Functions in SQL
Polymorphic Table Functions in SQLChris Saxon
 
Odoo (Build module, Security, ORM)
Odoo (Build module, Security, ORM)Odoo (Build module, Security, ORM)
Odoo (Build module, Security, ORM)sroo galal
 
Oracle SQL Developer Tips & Tricks
Oracle SQL Developer Tips & TricksOracle SQL Developer Tips & Tricks
Oracle SQL Developer Tips & TricksJeff Smith
 
Java - Interfaces & Packages
Java - Interfaces & PackagesJava - Interfaces & Packages
Java - Interfaces & PackagesArindam Ghosh
 
Core java concepts
Core java  conceptsCore java  concepts
Core java conceptsRam132
 
Lambda Expressions in Java
Lambda Expressions in JavaLambda Expressions in Java
Lambda Expressions in JavaErhan Bagdemir
 
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...Beat Signer
 
Kolaborasi jQuery, AJAX, PHP, dan MySQL
Kolaborasi jQuery, AJAX, PHP, dan MySQLKolaborasi jQuery, AJAX, PHP, dan MySQL
Kolaborasi jQuery, AJAX, PHP, dan MySQLI Putu Arya Dharmaadi
 
Apostila de poo em c++
Apostila de poo em c++Apostila de poo em c++
Apostila de poo em c++Lindomar ...
 

Tendances (20)

XPath
XPathXPath
XPath
 
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-endModularização via BPL - Abordagem Prática para DataSnap & Front-end
Modularização via BPL - Abordagem Prática para DataSnap & Front-end
 
encapsulation
encapsulationencapsulation
encapsulation
 
01. Pengenalan Web Server Dan Sss
01. Pengenalan Web Server Dan Sss01. Pengenalan Web Server Dan Sss
01. Pengenalan Web Server Dan Sss
 
Java Web Programming [1/9] : Introduction to Web Application
Java Web Programming [1/9] : Introduction to Web ApplicationJava Web Programming [1/9] : Introduction to Web Application
Java Web Programming [1/9] : Introduction to Web Application
 
Polymorphic Table Functions in SQL
Polymorphic Table Functions in SQLPolymorphic Table Functions in SQL
Polymorphic Table Functions in SQL
 
Html training slide
Html training slideHtml training slide
Html training slide
 
Odoo (Build module, Security, ORM)
Odoo (Build module, Security, ORM)Odoo (Build module, Security, ORM)
Odoo (Build module, Security, ORM)
 
Oracle SQL Developer Tips & Tricks
Oracle SQL Developer Tips & TricksOracle SQL Developer Tips & Tricks
Oracle SQL Developer Tips & Tricks
 
Java - Interfaces & Packages
Java - Interfaces & PackagesJava - Interfaces & Packages
Java - Interfaces & Packages
 
Core java concepts
Core java  conceptsCore java  concepts
Core java concepts
 
SQL
SQLSQL
SQL
 
Interfaces in java
Interfaces in javaInterfaces in java
Interfaces in java
 
Lambda Expressions in Java
Lambda Expressions in JavaLambda Expressions in Java
Lambda Expressions in Java
 
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
Structured Query Language (SQL) - Lecture 5 - Introduction to Databases (1007...
 
XSLT.ppt
XSLT.pptXSLT.ppt
XSLT.ppt
 
Java 8 lambda
Java 8 lambdaJava 8 lambda
Java 8 lambda
 
Kolaborasi jQuery, AJAX, PHP, dan MySQL
Kolaborasi jQuery, AJAX, PHP, dan MySQLKolaborasi jQuery, AJAX, PHP, dan MySQL
Kolaborasi jQuery, AJAX, PHP, dan MySQL
 
Apostila de poo em c++
Apostila de poo em c++Apostila de poo em c++
Apostila de poo em c++
 
Sql server
Sql serverSql server
Sql server
 

Similaire à XSLT

Similaire à 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
 

Plus de 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
 
RDF Validation Future work and applications
RDF Validation Future work and applicationsRDF Validation Future work and applications
RDF Validation Future work and applicationsJose Emilio Labra Gayo
 

Plus de 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
 
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
 
RDF Validation Future work and applications
RDF Validation Future work and applicationsRDF Validation Future work and applications
RDF Validation Future work and applications
 

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