2008-12-10 8 views
5

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.¿Utiliza XSL para generar XSL dinámico que se ejecuta dentro del mismo script?

Esto 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 ejecutarlo 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.

Respuesta

1

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

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

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 estilos XSLT dinámicamente.

14

XSLT tiene una función incorporada especial que admite la generación de salida, que es XSLT sí mismo.

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

Como explaiened porthe XSLT 1.0 Spec:.

"

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

Una hoja de estilo puede utilizar el elemento xsl:namespace-alias para declarar que un espacio de nombres URI es un alias para otro espacio de nombres URI Cuando un espacio de nombres literal URI. ha sido declarado como un alias para otro URI de espacio de nombres, entonces el URI de espacio de nombres en el árbol de resultados será el URI de espacio de nombres para el que es el alias de espacio de nombres literales, en lugar del URI de espacio de nombres literal. res 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 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 result-prefix especifica el URI de espacio de nombres correspondiente que aparecerá en el árbol de resultados. "

Aquí es un pequeño ejemplo de una transformación que genera una xsl:stylesheet que contiene un xsl:variable, que se construye en la forma 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 se produce:

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

A continuación, el siguiente paso será lanzar en su "guión" esta generado dinámicamente transformación XSLT.

+0

Simplemente ejecutando su ejemplo produce resultados diferentes a su respuesta. Lo que realmente sale es: ' myValue ' –

+0

@blast_hardcheese, no se garantiza que el prefijo del espacio de nombres sea el mismo que el especificado en el atributo' result-prefix' de la declaración 'xsl: namespace-alias' - solo se utiliza para especificar el ** espacio de nombres ** en el que los elementos del resultado literal se deben incluir en el resultado. Por lo tanto, qué prefijo usar en realidad depende del procesador XSLT. Saxon usa el mismo prefijo que el especificado en el atributo 'result-prefix'. Sin embargo, otros procesadores XSLT tienen la libertad de usar lo que sus desarrolladores decidieron que era apropiado. –

+0

@blast_hardcheese, probablemente sepa que si en dos archivos XML solo algunos prefijos (no los URI de espacio de nombres a los que están vinculados) son diferentes, estos dos archivos XML son equivalentes. –