Produrre una nuova linea in XSLT

Voglio produrre una nuova riga per l’output di testo in XSLT. Qualche idea?

Il seguente codice XSL produrrà un carattere di nuova riga (avanzamento riga):


 

Per un ritorno a capo , utilizzare:

 
 

Il mio metodo preferito per fare questo sembra qualcosa del tipo:

      ...  

Quindi, ogni volta che vuoi generare una nuova riga (forse in csv) puoi produrre qualcosa come:

  

Ho usato questa tecnica per l’output di SQL dall’input xml. In effetti, tendo a creare variabili per virgole, virgolette e newline.

Includere l’attributo Method = “text” sul tag xsl: output e includere newlines nel contenuto letterale nell’XSL nei punti appropriati. Se si preferisce mantenere il codice sorgente del proprio ordine XSL, utilizzare l’ quadro dove vuoi una nuova linea.

Puoi utilizzare:

vedere l’esempio

   =  
  

se scrivi questo nel file es

    

questa variabile produrrà una nuova riga in infile come:

 commons-dbcp_commons-dbcp = 1.2.2 junit_junit = 4.4 org.easymock_easymock = 2.4 

Ho aggiunto la direttiva DOCTYPE che vedi qui:

 < ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE xsl:stylesheet [  ]>  

Questo mi permette di usare &nl; invece di per produrre una nuova riga nell’output. Come altre soluzioni, questo è in genere collocato all’interno di un .

IMHO non più informazioni di quelle che @Florjon ha dato è necessario. Forse alcuni piccoli dettagli sono lasciati a capire perché a volte potrebbe non funzionare per noi.

Prima di tutto, (hex) o (dec) all’interno di funzioneranno sempre, ma potresti non vederlo.

  1. Non c’è una nuova riga in un markup HTML. Usando un semplice
    andrà bene. Altrimenti vedrai uno spazio bianco. La visualizzazione della fonte dal browser ti dirà cosa è successo veramente. Tuttavia, ci sono casi in cui ci si aspetta questo comportamento, specialmente se il consumatore non è direttamente un browser. Ad esempio, si desidera creare una pagina HTML e visualizzarne la struttura formattata in modo corretto con linee e identi vuoti prima di servirla nel browser.
  2. Ricorda dove devi usare disable-output-escaping e dove non lo fai. Prendiamo il seguente esempio in cui ho dovuto creare un xml da un altro e dichiarare il suo DTD da un foglio di stile.

La prima versione sfugge ai caratteri (default per xsl: testo)

    <!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


           

E questo è il risultato:

 < ?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd"> 
   

Ok, fa quello che ci aspettiamo, l’escape è fatto in modo che i caratteri che abbiamo usato siano visualizzati correttamente. La formattazione della parte XML all’interno del nodo radice è gestita da ident="yes" . Ma osservando da vicino vediamo che il carattere di nuova riga non è stato sfuggito e tradotto così com’è, eseguendo un doppio avanzamento di riga! Non ho una spiegazione su questo, sarà bello sapere. Chiunque?

La seconda versione non sfugge ai personaggi, quindi producono quello per cui sono destinati. La modifica apportata è stata:

 <!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


 

E questo è il risultato:

 < ?xml version="1.0" encoding="utf-8"?> < !DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">    

e quello andrà bene Sia cr che lf sono correttamente renderizzati.

  1. Non dimenticare che stiamo parlando di nl , non di crlf ( nl=lf ). Il mio primo tentativo è stato quello di utilizzare solo cr: e mentre l’output xml è stato validato correttamente dal DOM.

Stavo visualizzando un xml corrotto:

 < ?xml version="1.0" encoding="utf-8"?> riptions SYSTEM "Subscriptions.dtd">   

Il parser DOM ha ignorato i caratteri di controllo ma il rendering non lo ha fatto. Ho passato un bel po ‘di tempo a sbattere la testa prima di rendermi conto di quanto stucchevole non stavo vedendo questo!

Per la cronaca, io uso una variabile all’interno del corpo con entrambi i CRLF solo per essere sicura al 100% che funzionerà ovunque.

Ho trovato una differenza tra le nuove righe letterali in e le newline letterali che utilizzano .

Mentre le nuove righe letterali funzionavano bene nel mio ambiente (usando sia Saxon che il processore XSLT Java predefinito) il mio codice non funzionava quando veniva eseguito da un altro gruppo in esecuzione in un ambiente .NET.

Il passaggio a quadro ( ) ha ottenuto il mio codice di generazione file in modo coerente sia su Java che su .NET.

Inoltre, le nuove righe letterali sono vulnerabili a essere riformattate dagli IDE e possono inavvertitamente perdersi quando il file viene gestito da qualcuno che non è a conoscenza.

Ho notato dalla mia esperienza che produrre una nuova riga INSIDE una clausola non funziona. Stavo cercando di fare qualcosa come:

    My value:     My other value:      

Qualunque cosa ho provato a inserire in questa “nuova linea” (il nodo vuoto ) non ha funzionato (inclusa la maggior parte dei suggerimenti più semplici in questa pagina), per non parlare del fatto che l’HTML non funzionerà lì, quindi alla fine ho dovuto dividerlo in 2 variabili, chiamarle al di fuori dell’ambito e mettere un semplice
tra loro, cioè:

    My value:         My other value:      

Sì, lo so, non è la soluzione più sofisticata ma funziona, basta condividere la mia esperienza di frustrazione con gli XSL;)

Io secondo il metodo di Nic Gibson, questo è sempre stato il mio preferito:

   

Tuttavia, ho utilizzato l’attività Ant per creare fogli di stile ed eseguirli contro i file. L’attività eseguirà modelli di valore dell’attributo, ad esempio $ {DSTAMP}, ma riformatterà anche il tuo xml, quindi in alcuni casi è preferibile il riferimento all’ quadro.

 
 

Non potevo semplicemente usare l’approccio perché se modifico il file XML usando XSLT l’ quadro scomparirà. Quindi ho dovuto usare un approccio un po ‘più rotondo usando le variabili

      

Puoi provare,

 
 

Funzionerà.

aggiungi questo tag:

 

per me funziona 😉 .