2012-05-01 9 views
5

Utilizzando XPath, desidero "Abbinare parola intera" (opzione per utente, proprio come nella ricerca VS).XPath: corrispondenza parola intera (utilizzando la funzione di corrispondenza con flag senza distinzione tra maiuscole e minuscole)

Sembra che le funzioni contains e matches funzionino in modo simile sebbene le corrispondenze consentano di contrassegnare come i per insensibilità al maiuscolo/minuscolo.

In altre parole, sto ottenendo gli stessi risultati con queste query due XPath:

<pets> 
    <dog name="Rupert" color="grey"/> 
    <dog name="Ralph" color="brown"/> 
    <cat name="Marvin the Cat" color="white"/> 
    <cat name="Garfield the Cat" color="orange"/> 
    <cat name="Cat" color="grey"/> 
    <cat name="Fluffy" color="black"/> 
</pets> 

Matches XPath: //cat[descendant-or-self::*[@*[matches(.,'Cat')]]] 
    returns: 
    <cat name="Marvin the Cat" color="white"/> 
    <cat name="Garfield the Cat" color="orange"/> 
    <cat name="Cat" color="grey"/> 


Contains XPath: //cat[descendant-or-self::*[@*[contains(.,'Cat')]]] 
    returns: 
    <cat name="Marvin the Cat" color="white"/> 
    <cat name="Garfield the Cat" color="orange"/> 
    <cat name="Cat" color="grey"/> 

ma vorrei usare matches per restituire i risultati che corrispondono a "Gatto" intera parola solo:

<cat name="Cat" color="grey"/> 

Come posso regolare la query delle corrispondenze in modo che corrisponda alla parola intera?

MODIFICA: Ho dimenticato di dire che ho ancora bisogno di usare la funzione partite perché ho bisogno del flag di insensibilità del caso.

risposta

5

Informazioni sull'utilizzo di ^ e $ caratteri come ancore?

//cat[descendant-or-self::*[@*[matches(.,'^Cat$')]]] 

Da RegEx Syntax in XQuery 1.0 and XPath 2.0:

Due meta-caratteri, ^ e $ sono aggiunti. Per impostazione predefinita, il meta-carattere ^ corrisponde all'inizio dell'intera stringa, mentre $ corrisponde alla fine di l'intera stringa.

+0

Hmm .. questo mi dà il risultato che voglio. Ma potresti spiegare le^$ ancore? Non li ho mai usati prima .. – developer

+0

Aggiunto un collegamento in una risposta, vedere la sezione "Due meta-caratteri ...". –

+1

Grazie, avrò ancora bisogno di fare qualche test, ma questo sembra fare il trucco! – developer

2

Questo lavoro potrebbe funzionare?

//cat[@*='Cat'] 
+0

Non proprio quello che sto cercando. Voglio comunque utilizzare la funzione di corrispondenza perché ho bisogno di insensibilità alle maiuscole/minuscole ... (vedi modifica sopra). – developer

1

questo:

//cat[@*='Cat'] 

risultati in:

<cat name="Cat" color="grey"/> 

ho verificato utilizzando Xacobeo.

+0

Non proprio quello che sto cercando. Voglio comunque utilizzare la funzione di corrispondenza perché ho bisogno di insensibilità alle maiuscole/minuscole ... (vedi modifica sopra). – developer

+1

@developer Prova questa: '// gatto [Traduci (@ *, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'cat']' Questo presuppone che si passa sempre la stringa che si desidera far corrispondere da come minuscole. –

2

Qui ci sono tre funzioni/operatori di pertinenza.

matches() fa corrispondere un'espressione regolare; puoi usarlo per abbinare una sottostringa o per abbinare l'intera stringa usando le ancore (^ cat $), ed è possibile impostare il flag 'i' per renderlo case-blind.

contiene() fa una corrispondenza esatta di una sottostringa; è possibile utilizzare il terzo argomento (confronto) per richiedere una corrispondenza caso-cieco, ma il modo in cui vengono specificate le regole di confronto dipende dal processore che si sta utilizzando.

L'operatore eq esegue una corrispondenza esatta dell'intera stringa; le "regole di confronto predefinite" (che nel caso di XPath vengono tipicamente impostate utilizzando l'API del processore) possono essere utilizzate per richiedere la corrispondenza tra maiuscole e minuscole.Questo sembra essere quello più vicino alle tue esigenze, l'unico inconveniente è che specificare le regole di confronto è più dipendente dal sistema che utilizzare il flag "i" con matches().

2

Ma vorrei usare le partite per restituire i risultati che corrispondono a "Gatto" intera parola solo:

<cat name="Cat" color="grey"/> 

ci sono diverse espressioni XPath che selezionare l'elemento desiderato:

Uso:

/*/cat[matches(@name, '^cat$', 'i')] 

o usare:

/*/cat[lower-case(@name) eq 'cat'] 

XSLT - verifica base:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:copy-of select= 
    "/*/cat[matches(@name, '^cat$', 'i')]"/> 
====== 
    <xsl:copy-of select= 
    "/*/cat[lower-case(@name) eq 'cat']"/> 

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

se applicato sul documento XML fornito:

<pets> 
    <dog name="Rupert" color="grey"/> 
    <dog name="Ralph" color="brown"/> 
    <cat name="Marvin the Cat" color="white"/> 
    <cat name="Garfield the Cat" color="orange"/> 
    <cat name="Cat" color="grey"/> 
    <cat name="Fluffy" color="black"/> 
</pets> 

questa trasformazione valuta la due XPath espressioni e copia il elementi selezionati per l'uscita:

<cat name="Cat" color="grey"/> 
====== 
    <cat name="Cat" color="grey"/> 
Problemi correlati