Domanda

è affatto possibile 'pre-proccess' in XSLT?

con la pre-elaborazione intendo l'aggiornamento del (in memoria rappresentazione) dell'albero dei sorgenti.

Questo è possibile, o non ho bisogno di fare più trasformazioni per esso.

caso d'uso: abbiamo manuali di riferimento per i clienti Docbook fuori, ma per alcuni clienti questi bisogno diverse 'skins' (immagini differenti, ecc). Quindi quello che speravo di fare è trasformare l'immagine fileref percorso a seconda di un parametro. quindi applicare il resto dei normali modelli XSL DocBook.

È stato utile?

Soluzione

Ampliando la risposta di Eamon ...

Nel caso di una XSLT 1.0 o 2.0, che ci si avvia mettendo il risultato intermedio (pre-trattati) in un: elemento , dichiarata sia a livello globale (di primo livello) o localmente (all'interno di un template ).

<xsl:variable name="intermediate-result">
  <!-- code to create pre-processed result, e.g.: -->
  <xsl:apply-templates mode="pre-process"/>
</xsl:variable>

In XSLT 2.0, il valore della variabile $ intermedia risultato è una sequenza nodo costituito da un nodo di documenti (è stato chiamato "nodo principale" in XSLT / XPath 1.0). È possibile accedere e utilizzare proprio come si farebbe con qualsiasi altra variabile, ad esempio, selezionare = "$ intermedio risultato / doc"

Ma in XSLT 1.0, il valore della variabile intermedia risultato $ non è un set di nodi di prima classe. Invece, è qualcosa che si chiama un "risultato albero frammento". Si comporta come un nodo-set contenente un nodo radice, ma si sta limitato nel modo in cui è possibile utilizzarlo. È possibile copiare e ottenere la sua stringa di valore, ma non è possibile eseguire il drill down usando XPath, come in select = "$ intermedio risultato / doc". Per fare questo, è necessario prima convertirlo in un set di nodi utilizzando set-nodo funzione di estensione del processore () di prima classe. A Saxon 6.5, libxslt, e 4xslt, è possibile utilizzare exsl: node-set () (come nella risposta di Eamon). In MSXML, avresti bisogno di usare msxsl: serie di nodi (), dove xmlns: msxsl = "urn: schemas-microsoft-com: XSLT", e in Xalan, credo si chiami xalan: serie di nodi () (senza il trattino, ma dovrete Google per lo spazio dei nomi URI). Ad esempio: selezionare = "exsl: set di nodi ($ intermedio-risultato) / doc"

XSLT 2.0 semplicemente abolito il frammento albero risultato, rendendo il nodo-set () non necessarie.

Altri suggerimenti

Questo non è possibile con gli standard compliant XSLT 1.0. E 'possibile in ogni implementazione effettiva che ho usato, tuttavia. Le estensioni con cui fanno differiscono da motore, tuttavia. E 'anche possibile in XSLT 2.0 standard (che è in ogni caso molto più facile lavorare con - quindi se si può, basta usare quello).

Se il processore XSLT supporta EXSLT , il exsl: set di nodi () funzione fa quello che stai cercando. msxml ha una funzione di estensione stesso nome così (ma con un diverso URI spazio dei nomi, le funzioni non sono purtroppo banalmente compatibile).

Dal momento che si sta tentando di generare output leggermente diverso dalla stessa sorgente XML DocBook, si potrebbe desiderare di esaminare la "profilazione" supporto (condizionale markup) in DocBook fogli di stile XSL. Vedere Capitolo 26 in DocBook XSL: The Complete Guide da Bob Stayton:

  

Profiling è il termine usato in DocBook   per descrivere testo condizionale.   Testo condizionale significa che è possibile creare   un unico documento XML con un po '   elementi contrassegnati come condizionale. quando   si elaborare tale documento, è possibile   specificare quali condizioni si applicano per   tale versione di produzione, e la   foglio di stile sarà includere o escludere la   il testo marcato per soddisfare le condizioni.   Questa funzione è utile quando è necessario   per la produzione di più di una versione di un   documento, e le versioni differiscono   modi minori.

Ad esempio, per utilizzare le immagini differenti per, diciamo, le versioni Windows e Mac di uno stesso documento, si potrebbe avere un DocBook frammento XML in questo modo:

<figure>
  <title>The Foo dialog</title>
  <mediaobject>
    <imageobject os="windows">
      <imagedata fileref="screenshots/windows/foo.png"/>
    </imageobject>
    <imageobject os="mac">
      <imagedata fileref="screenshots/mac/foo.png"/>
    </imageobject>
  </mediaobject>
</figure>

Poi, si dovrebbe utilizzare le versioni profilazione-enabled dei fogli di stile XSL DocBook con il parametro profile.os impostato su windows o mac.

Forse si dovrebbe utilizzare XSLT metodi "OOP" qui. Mettere tutti i modelli comuni a tutti i clienti in un foglio di stile, e creare un foglio di stile per ogni cliente con i modelli specifici imperativi quelli comuni. Importare il foglio di stile comune all'interno quelle specifiche con xsl:. Importazione, e farete solo una trasformazione chiamando il foglio di stile che corrisponde ad un cliente

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top