2011-05-10 16 views
8

UPDATE 17.Jul.2013:
XALAN 2.7non memorizza nella cachedocument() chiamate all'interno di una richiesta. Quindi è fondamentale archiviare ogni documento necessario in una variabile nell'XSL.documento XSLT(): è più lento quando lo si chiama più volte?


Ho cercato per un po 'e non ho trovato risposte concrete alla mia semplice domanda:

Quale approccio è più veloce o è il compilatore "intelligente" abbastanza in modo che entrambe le varianti sono la stessa cosa ?

Nota: sto usando Xalan (implementazione di default in JDK 1.6) 2.7:

1) devo leggere una proprietà in un XML esterno:

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

Ogni volta che ho bisogno della città, io uso l'espressione sopra (diciamo 100 volte)

2) Invece di chiamare il documento() 100 volte, memorizzo il nodo XML in una variabile:

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

E poi io uso 100 volte

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

che uno è più veloce, migliore, per quali ragioni? Grazie!

+0

Sono anche interessato a una risposta esperta, ma, come penso, il caso con più chiamate di 'documento (path_to_doc)' dipende dalla realizzazione del caching del processore xslt, nel caso in cui il nodo del documento memorizzato nella variabile deve essere caricato una volta in ogni caso. –

+0

Sì, suppongo anche che ** dipenda dall'implementazione ** del processore, ma sono curioso di sapere come funziona ** Xalan 2.7 (processore predefinito in JDK 1.6) **. – basZero

+0

Non sono al 100% positivo, ma penso che Xalan non memorizzi i risultati di 'document()', ma xsltproc lo fa. Tuttavia l'argomento 'document()' è interpretato come un URI ([vedi specifica] (http://www.w3.org/TR/xslt#add-func)), quindi un caching aggressivo sarebbe perfettamente logico. –

risposta

3

Entrambi i metodi devono essere eseguiti per la stessa ora se un processore XSLT non è ingenuo, perché la funzione del documento dovrebbe restituire lo stesso risultato quando viene chiamata con lo stesso argomento, non importa quante volte.

Entrambi i metodi non sono efficienti, a causa dell'uso dell'abbreviazione //, che causa l'attraversamento dell'intero albero del documento.

Consiglierei seguente più economica di entrambi i metodi vengono discussi:

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

quindi riferimento solo$vCities.

In questo modo si è attraversato il documento solo una volta.

+3

+1. Dimitre, puoi darmi un riferimento per la regola dell'idempotenza che hai menzionato? L'ho sentito prima, ma sono rimasto sorpreso di non vederlo nelle specifiche XSLT 1.0 o 2.0. – LarsH

+0

@LarsH: Sono stato anche sorpreso - potrebbe essere in un documento errata da qualche parte ... –

+0

btw: il '//' era solo un esempio e non avrebbe dovuto far parte della mia domanda, mi dispiace! il focus è sulla funzione 'document()'. Quindi non sono ancora sicuro se faccia la differenza in ** XALAN 2.7 **! – basZero

2

Sembra che tu comprenda i principi coinvolti, quindi non hai bisogno di spiegazioni.

Se vuoi sapere come funziona Xalan 2.7, la risposta definitiva verrà trovata testandola con Xalan 2.7, con un test abbastanza grande.

Come indicato da @Dimitre, nessuno dei due è necessariamente efficiente, a causa dello //, sebbene alcuni processori siano intelligenti nell'ottimizzare questi tipi di percorsi, attenuando il problema.Si potrebbe aiutare il processore più efficiente, mantenendo l'elemento city in una variabile:

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

ho aggiunto [1] in là per un'ulteriore ottimizzazione, perché lei ha detto "la città" (vale a dire che ci si aspetta solo uno), e questo permette un processore intelligente da arrestare dopo aver trovato il primo elemento city.

+0

+1 per una risposta corretta. –

+0

La discussione non riguarda il '//', l'ho rimosso dall'esempio. Metterò alla prova 'document()' cercando di vedere le richieste nel registro per ogni chiamata 'document()'. Ma prima di investire tempo in questo, ho pensato che qualcuno qui lo avrebbe saputo (dal codice sorgente). – basZero

+0

Qualcuno si preoccupa di spiegare perché il downvote? Non so se provenisse da @bas – LarsH

Problemi correlati