2011-05-10 13 views
8

ACTUALIZACIÓN 17.Jul.2013:
XALAN 2.7no almacena en cachédocument() llamadas dentro de una petición. Por lo tanto, es crucial almacenar cada documento necesario en una variable en el XSL.Documento XSLT(): ¿Es más lento cuando lo llamas varias veces?


He buscado durante bastante tiempo y no encontrar respuestas concretas a mi simple pregunta:

¿Qué método es más rápido o el compilador es suficientemente "inteligentes" de modo que ambas variantes son los mismos ?

Nota: Estoy usando Xalan (aplicación por defecto en el JDK 1.6) 2.7:

1) Tengo que leer una propiedad en un XML externo:

<xsl:value-of select="document($path)/person/address/city"/> 

Siempre que necesito la ciudad, utilizo la expresión anterior (digamos 100 veces)

2) En lugar de llamar al documento() 100 veces, almaceno el nodo XML en una variable:

<xsl:variable name="node" select="document($path)"/> 

Y entonces yo uso 100 veces

<xsl:value-of select="$node/person/address/city"/> 

es más rápido, mejor, para lo cual razones Cuál? ¡Gracias!

+0

También estoy interesado en una respuesta experta, pero, como creo, el caso con llamadas múltiples de 'document (path_to_doc)' depende de la realización del almacenamiento en caché xslt, en el caso, cuando el nodo document almacenado en la variable debe cargarse una vez en cualquier caso. –

+0

Sí, también creo que ** depende de la implementación ** del procesador, pero me llama la atención cómo ** Xalan 2.7 (procesador predeterminado en JDK 1.6) ** lo hace. – basZero

+0

No soy 100% positivo, pero creo que Xalan no almacena en caché los resultados de 'document()', pero xsltproc sí lo hace. Sin embargo, el argumento 'document()' se interpreta como un URI ([ver especificación] (http://www.w3.org/TR/xslt#add-func)), por lo que un almacenamiento en caché agresivo tendría mucho sentido. –

Respuesta

3

Ambos métodos deben ejecutarse por el mismo tiempo si un procesador XSLT no es ingenuo, porque la función del documento debe devolver el mismo resultado cuando se llama con los mismos argumentos, sin importar cuántas veces.

Ambos métodos no son eficientes, debido al uso de la abreviatura //, lo que hace que todo el árbol de documentos que deben desplazarse.

recomendaría lo siguiente como más eficiente que se discuten ambos métodos:

<xsl:variable name="vCities" select="document($pUrl)//cities"/> 

entonces única referencia$vCities.

De esta manera ha recorrido el documento una sola vez.

+3

+1. Dimitre, ¿puedes darme una referencia para la regla de idempotencia que mencionaste? Lo he escuchado antes, pero me sorprendió no verlo en las especificaciones XSLT 1.0 o 2.0. – LarsH

+0

@LarsH: También me sorprendió - podría estar en un documento de errata en alguna parte ... –

+0

por cierto: el '//' era solo un ejemplo y no debería haber sido parte de mi pregunta, lo siento! el foco está en la función 'document()'. ¡Así que todavía no estoy seguro de si hace una diferencia en ** XALAN 2.7 **! – basZero

2

Parece que entiende los principios involucrados, por lo que no necesita ninguna explicación.

Si quieres saber cómo lo hace Xalan 2.7, la respuesta definitiva se encontrará al probarlo con Xalan 2.7, con una prueba suficientemente grande.

Como señaló @Dimitre, ninguno de estos es necesariamente eficiente, debido al //, aunque algunos procesadores son inteligentes para optimizar ese tipo de rutas, lo que mitiga el problema.Usted podría ayudar a que el procesador sea más eficiente manteniendo el elemento city en una variable:

<xsl:variable name="city" select="(document($path)//city)[1]"/> 
... 
<xsl:value-of select="$city"/> 

añadí [1] allí para una mayor optimización porque dijiste "la ciudad" (es decir, se puede esperar sólo uno), y esto permite un procesador inteligente para detenerse después de encontrar el primer elemento city.

+0

+1 para una respuesta correcta. –

+0

La discusión no es sobre el '//', lo eliminé del ejemplo. Voy a probar el 'document()' tratando de ver las solicitudes en el registro para cada llamada 'document()'. Pero antes de invertir tiempo en esto, pensé que alguien aquí lo sabría (del código fuente). – basZero

+0

¿Alguien quiere explicar por qué el voto a favor? No sé si era de @bas – LarsH

Cuestiones relacionadas