2011-12-05 12 views
5

Sth dovrebbe essere tutte le lettere o in espressioni regolari [A-Z]. Come combinare xslt con le espressioni regolari?Come scrivere xslt se l'elemento contiene lettere?

<xsl:if test="string-contains(//ns0:elem/value, 'sth')"> 


     </xsl:if> 
+0

@_marko: hai letto la mia risposta ed è stato utile? –

+0

Ho appena aggiornato la risposta con una seconda espressione XPath e un esempio di codice completo che dimostra entrambe le espressioni XPath 1.0, la prima che utilizza il metodo * double-translate *. –

risposta

9

XPath/XSLT 1.0 non supporta le espressioni regolari, ma semplice validazione può essere effettuata utilizzando le funzioni di base di stringa.

Inserimento delle

Il XPath 1.0 translate funzione può essere utilizzata per simulare un whitelist:

<xsl:variable name="alpha" 
       select="'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:if test="string-length(translate(., $alpha, '')) &gt; 0"> 
    <!-- context node contains non-alpha characters --> 
</xsl:if> 

Il test utilizza translate prima rimuovere tutte le lettere maiuscole e minuscole.Se la lunghezza della stringa risultante è diversa da zero, la stringa originale deve contenere caratteri aggiuntivi.

noti che l'espressione di cui sopra potrebbe essere semplificata per:

<xsl:if test="translate(., $alpha, '')"> 

... perché qualsiasi stringa non vuota restituisce true.

Blacklisting

Utilizzare il metodo a doppio translate a trattare $alpha come una lista nera:

<xsl:if test="translate(., translate(., $alpha, ''), '')"> 
    <!-- context-node contains characters on the blacklist (in $alpha) --> 
</xsl:if> 

L'interno translate restituisce una stringa con tutti i suoi caratteri alfa rimossi, che viene quindi utilizzato come modello alla seconda chiamata translate, risultante in una stringa contenente solo i caratteri alfa. Se questa stringa non è zero, abbiamo trovato un carattere nella lista nera. Questo è un approccio classico. Vedere, per esempio, questa domanda precedente sui SO:

Un test lista nera può essere quindi eseguita in questo modo:

not(string-length(translate(., $alpha, ''))=string-length()) 

Se la lunghezza della stringa dopo aver rimosso tutti dei caratteri inseriti nella lista nera non è uguale alla lunghezza della stringa originale, quindi la stringa deve aver contenuto un carattere nella lista nera.

Sommario

Liste bianche e nere sono davvero due facce della stessa medaglia. Quanto segue dimostra il loro utilizzo insieme:

<xsl:if test="translate(., $alpha, '')"> 
    [contains some characters not on the list] 
</xsl:if> 
<xsl:if test="not(translate(., $alpha, ''))"> 
    [contains only characters on the list] 
</xsl:if> 
<xsl:if test="translate(., translate(., $alpha, ''), '')"> 
    [contains some characters on the list] 
</xsl:if> 
<xsl:if test="not(translate(., translate(., $alpha, ''), ''))"> 
    [contains only characters not on the list] 
</xsl:if> 
2

In XPath 1.0 (funziona con XSLT 1.0), non si dispone di strumento per regolare (basta funzioni come contains o starts-with, vedi link qui sotto per maggiori informazioni)

in XPath 2.0 (funziona con XSLT 2.0), hai la funzione matches e la funzione replace (vedi link sotto).

URL per vedere:

XPath 1.0 funzioni stringa: http://www.w3.org/TR/xpath/#section-String-Functions

XPath 2.0 funzioni regex: http://www.w3.org/TR/xpath-functions/#string.match

+1

Ho una soluzione e sto usando la versione 1.0. Come cercare le lettere in una stringa se non riesci a usare espressioni regolari in xslt? – marko

2

Come cercare per le lettere in una stringa, se non è possibile utilizzare espressioni regolari in xslt?

Buona domanda, +1.

Uso:

translate(., translate(., $vAlpha, ''), '') 

Questo produce tutti i caratteri del valore stringa del nodo corrente, chesonoin $vAlpha

Nel caso in cui si desidera vedere se una stringa data $str contiene solo lettere e nessun altro carattere, usa :

string-length(translate($str, $vAlpha, '')) = 0 

Un esempio di codice completo:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:variable name="vUpper" select= 
    "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 

<xsl:variable name="vLower" select= 
    "'abcdefghijklmnopqrstuvwxyz'"/> 

<xsl:variable name="vAlpha" select= 
     "concat($vUpper, $vLower)"/> 

<xsl:variable name="vStr" select="'A12B_..c02d'"/> 

<xsl:template match="/"> 
    <xsl:value-of select= 
    "translate($vStr, 
       translate($vStr, $vAlpha, ''), '') 
    "/> 


    The string <xsl:value-of select="$vStr"/> has <xsl:text/> 
    <xsl:value-of select= 
    "string-length(translate($vStr, $vAlpha, ''))"/> <xsl:text/> 
    non-letters 

</xsl:template> 
</xsl:stylesheet> 

quando questa trasformazione viene applicato su qualsiasi documento XML (non utilizzato), la desiderata, risultato corretto viene prodotto:

ABcd 


    The string A12B_..c02d has 7 
    non-letters 

Ricorda: La prima espressione XPath sopra mostra il cosiddetto metodo "double-translate", proposto per la prima volta da Michael Michael Kay.

Problemi correlati