2012-06-13 12 views
5

¿Es aceptable llamar el mismo documento a lo largo de una XSLT-archivo de la siguiente manera:rendimiento al utilizar documentos() repetidamente en XSLT

<xsl:value-of select="document('doc.xml')/root/bar/foo1" /> 
<xsl:value-of select="document('doc.xml')/root/bar/foo2" /> 
<xsl:value-of select="document('doc.xml')/root/bar/foo3" /> 

...?

Me imagino que el almacenamiento en caché evita producir sobrecarga para leer el archivo una y otra vez.

¿O debería almacenar el doc.xm en una variable y usar esa variable para consultar?

En este caso tendré que usar algún tipo de biblioteca como xsle ya que estoy usando xslt1.

¿O hay alguna otra solución?

Nota: Algunas partes de la XPath debe ser dinámico como:

<xsl:value-of select="document('doc.xml')/root/*[name()=$lang]/foo3" /> 
+0

Para no tener dudas, siempre puede * medir * el rendimiento: en este caso específico, las mediciones deben confirmar la respuesta de Michael Kay. En general, la medición del rendimiento es el método recomendado para responder a estas preguntas en lugar de creerle a alguien. –

+0

Dimitre, por favor, vea mi observación sobre la respuesta de Woody. – Peter

Respuesta

2

Los procesadores XSLT son necesarios para garantizar que si llama a document() dos veces con la misma URL, los nodos devueltos son idénticos en el sentido que cuentan (document ('a.xml') | document ('a'xml')) = 1. Es bastante difícil cumplir este requisito sin almacenar en caché el documento, por lo que creo que puede estar razonablemente seguro de que cada documento solo se obtendrá y se analizará una vez. Sin embargo, ponerlo en una variable global nunca hará ningún daño.

+0

Si eres razonablemente seguro, entonces estoy ahora :-) ¡Gracias! – Peter

1

personal cuando he utilizado siempre lo he puesto en una variable por conveniencia, o tiene los valores que necesitaba, sólo para hacer es más fácil de leer Con MSXSL que estaba usando por última vez, podría ponerlo en un árbol de nodos y acceder a él de esa manera.

No me puedo imaginar que el procesador XSL no almacene en caché el mismo archivo de alguna manera, pero sospecho que es diferente para todos los procesadores y no parece estar escrito.

Si quisiera saber con el procesador que estaba usando, simplemente copiaría y pasaría un documento grande y lo mediría como una prueba, no lleva mucho tiempo hacerlo y es la única forma de estar seguro en tu sistema.

+0

Cierto es que a menudo no hay alternativa para probar ... Pero el mismo archivo xslt sin embargo puede estar alojado en diferentes plataformas, por lo que también es bienvenido un lineamiento o conocido 'por comportamiento de diseño'. – Peter

+0

De acuerdo. Bueno, usando MSXSL4, nunca noté una diferencia de rendimiento en ambos sentidos, por lo que solo puedo suponer que hubo almacenamiento en caché (estaba usando archivos grandes). No hay ningún requisito para ello en la especificación, pero sería difícil imaginar que no se hiciera – Woody

Cuestiones relacionadas