2014-12-19 16 views
5

Dopo aver risposto a un gran numero di domande XSLT qui su Stack Overflow, sono più che familiare con la tecnica di raggruppamento Muenchian per raggruppare i nodi durante una trasformazione XSL.Il [1] nel raggruppamento di Muenchian è davvero necessario?

L'espressione ivi usata è di solito qualcosa di simile:

*[generate-id() = 
    generate-id(key('kSomeKey', .)[1])] 

Contiene quasi invariabilmente che [1], ma questo ha sempre colpito me come dispari.

Il XSLT 1.0 specifica definisce generate-id() come segue:

La funzione generate-id restituisce una stringa che identifica univocamente il nodo nell'argomento node-set che è primo nell'ordine dei documenti.

(corsivo)

Si afferma chiaramente che la funzione agisce sul primo nodo nell'ordine del documento, e in questo contesto, il [1] sarebbe selezionando il primo nodo del gruppo nell'ordine del documento, così sembra che lo [1] sia ridondante.

Questo [1] viene utilizzato in modo così ampio da essere esitante a ometterlo, ma sembra estraneo. qualcuno può chiarire questo per me?

+2

Sarebbe necessario in XSLT 2.0, poiché 'generate-id' non consente un set di nodi come primo argomento in questo e genera un errore. Ovviamente, se si stesse usando XSLT 2.0, sarebbe più probabile usare 'xsl: for-each-group' piuttosto che il Muenchian Grouping. –

risposta

2

Semanticamente il [1] non è necessario ma a seconda della (mancanza di) ottimizzazione nel processore XSLT potrebbe essere più efficiente averlo. Dipenderà dall'interno di ciascun processore XSLT se key('key-name', foo)[1] calcola solo un nodo o prima calcola un nodo-set con tutti i nodi selezionati dalla chiave e quindi prende il primo tanto quanto dipende dal processore XSLT per riconoscere generate-id(key('key-name', foo)) come espressione dove è necessario solo il primo nodo nel set di nodi calcolato dalla chiave.

+0

Grazie! Questo sembra un buon motivo per continuare a usarlo. – JLRishe

4

Si consiglia di utilizzare sempre un "[1]" esplicito anziché sfruttare il fatto che le operazioni in XPath 1.0 lo fanno implicitamente. Per due motivi: migliora la leggibilità del tuo codice e lo rende compatibile con XPath 2.0. Ci possono essere processori in cui offre un vantaggio in termini di prestazioni, ma non vorrei speculare su questo finché non sarà provato con le misure.

+0

Grazie! (+1) Non sono sicuro di essere d'accordo sul fatto che migliora la leggibilità, ma l'interoperabilità è sempre un buon obiettivo. – JLRishe

+0

@JLRishe a qualcuno che ha meno familiarità con le specifiche XPath e XSLT direi che '[1]' migliora la leggibilità. Rende chiaro come si desidera verificare se questo nodo è il primo del suo gruppo e rende ovvio cosa modificare se si desidera verificare il secondo/terzo/ultimo nel gruppo anziché il primo. –