xsl tutorial transformar programacion las hojas freeformater estilo español ejemplos convertir aplicación xml xslt dynamic

xml - tutorial - xslt editor



Use XSL para generar XSL dinámico que se ejecuta dentro del mismo script? (2)

Quiero crear dinámicamente variables con nombres dinámicos para su uso posterior en mi transformación, pero para hacer esto tendré que generar dinámicamente XSL y luego ejecutarlo en el mismo script.

Este es solo un ejemplo de pseudo código aproximado de lo que estoy buscando.

<xsl:for-each select="//constants/constant" > <xsl:variable > <xsl:attribute name="name"> <xsl:value-of select="@name"/> </xsl:attribute> <xsl:attribute name="select"> <xsl:value-of select="@value"/> </xsl:attribute> </xsl:variable> </xsl:for-each>

¿Puedo usar XSL para construir dinámicamente XSL para que se ejecute más adelante en el mismo script?

Nota: nuestro XML se transforma mediante un proceso por lotes que ejecuta un motor de transformación CL XSL; así que solo hacer referencia a una hoja de estilo XSL en el documento XSL no es una opción.


Lo que quiere no es posible actualmente en XSLT puro (1.0 o 2.0).

Si está utilizando el procesador Saxon 9.x XSLT , hay un par de funciones de extensión que implementan esto: saxon: compile-stylesheet () y saxon: transform () .

Es muy raro que una solución a un problema realmente requiera tal funcionalidad y es muy posible que si usted describe el problema, la gente encuentre la mejor manera de resolverlo sin tener que producir y ejecutar una hoja de estilo XSLT dinámicamente.


XSLT tiene una función incorporada especial que admite generar resultados, que es XSLT .

Esta es la directiva <xsl:namespace-alias> XSLT.

Como se explica en la especificación XSLT 1.0 :

"

<!-- Category: top-level-element --> <xsl:namespace-alias stylesheet-prefix = prefix | "#default" result-prefix = prefix | "#default" />

Una hoja de estilo puede usar el elemento xsl:namespace-alias para declarar que un URI de espacio de nombres es un alias para otro URI de espacio de nombres. Cuando se ha declarado que un URI de espacio de nombres literal es un alias para otro URI de espacio de nombres, el URI de espacio de nombres en el árbol de resultados será el URI de espacio de nombres para el que es el alias del espacio de nombres literal, en lugar del URI de espacio de nombres literal. El elemento xsl:namespace-alias declara que el URI del espacio de nombres vinculado al prefijo especificado por el atributo stylesheet-prefix es un alias para el URI del espacio de nombres vinculado al prefijo especificado por el atributo del result-prefix del result-prefix . Por lo tanto, el atributo stylesheet-prefix especifica el URI de espacio de nombres que aparecerá en la hoja de estilo, y el atributo de result-prefix especifica el URI de espacio de nombres correspondiente que aparecerá en el árbol de resultados. "

Aquí hay un pequeño ejemplo de una transformación que genera una xsl:stylesheet contiene una xsl:variable que se construye de la manera deseada:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xxx="my:dummyNS" exclude-result-prefixes="xxx" > <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:namespace-alias result-prefix="xsl" stylesheet-prefix="xxx"/> <xsl:template match="/*"> <xxx:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xxx:variable name="{@name}"> <xsl:value-of select="."/> </xxx:variable> </xxx:stylesheet> </xsl:template> </xsl:stylesheet>

Cuando se aplica esta transformación en el siguiente documento XML:

<v name="myVarName">myValue</v>

el resultado deseado es producido:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="myVarName">myValue</xsl:variable> </xsl:stylesheet>

Luego, el próximo paso será lanzar en su "script" esta transformación XSLT generada dinámicamente .