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>
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>
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, '')) > 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>
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
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
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.
@_marko: hai letto la mia risposta ed è stato utile? –
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 *. –