Utilizzando FXSL (libreria open source per XSLT programmazione funzionale, scritto interamente in XSL T) si scrive semplicemente:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="trim.xsl"/>
<xsl:output method="text"/>
<xsl:template match="/*/description">
'<xsl:call-template name="trim">
<xsl:with-param name="pStr" select="."/>
</xsl:call-template>'
</xsl:template>
</xsl:stylesheet>
Quando questa trasformazione viene applicata sul documento XML fornito:
<car>
<description> To get more information look at: www.example.com </description>
</car>
The Wanted, risultato corretto è prodotto:
'To get more information look at: www.example.com'
Come funziona il modello trim
?
Taglia gli spazi bianchi iniziali, quindi inverte la stringa risultante e taglia gli spazi bianchi iniziali, quindi inverte infine la stringa risultante.
II. XPath soluzione 2,0:
Uso:
replace(replace(/*/description, '^\s*(.+?)\s*$', '$1'), '^ .*$', '')
Ecco un XSLT - 2.0 - verifica base:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
"<xsl:sequence
select="replace(replace(/*/description, '^\s*(.+?)\s*$', '$1'), '^ .*$', '')"/>"
</xsl:template>
</xsl:stylesheet>
Quando questa trasformazione viene applicata sul documento XML fornito (sopra), l'espressione XPath viene valutata e il risultato di questa valutazione viene copiato nell'output:
"To get more information look at: www.example.com"
Mi piace la soluzione pulita di non dover aggiungere ulteriori librerie - grazie per questo! Dato che prima dovrei chiedere al project manager, se possiamo aggiungere librerie aggiuntive, questa soluzione è chiaramente preferibile per me. Immagino che non ci sia modo di mettere semplicemente un parametro all'inizio del file xsl per avere tutti i campi in pareggio, vero? Ho trovato '', ma questo viene applicato _after_ le altre trasformazioni come 'concat (...)', portando a risultati come 'Lastname, Firstname' invece di' Lastname, Firstname'. Sembra che non ci sia una soluzione così semplice ... –
@MathiasBader: 'xsl: strip-space' opera sul documento di origine, prima di qualsiasi trasformazione e rimuove i nodi di testo che contengono solo spazi. Probabilmente non risolverà il tuo problema. La soluzione più semplice sarebbe probabilmente quella di creare una trasformazione separata che taglia solo gli spazi bianchi degli elementi selezionati e usa il risultato come input per la seconda trasformazione. Questo può essere fatto in un singolo foglio di stile usando le funzioni di estensione per un processore specifico o usando uno strumento/api esterni per richiamare le trasformazioni. –
Usare una (pre) trasformazione separata con uno strumento esterno era qualcosa che avevo anche in mente. Ho solo pensato che il problema sembra essere così comune, che ho pensato che ci fosse una soluzione più semplice fornita da XSLT che non avevo ancora trovato. –