2012-05-01 6 views
5

Usando XPath, me gustaría "Coincidir palabra completa" (opción para el usuario, al igual que en la búsqueda VS).XPath: Coincide con la palabra completa (usando la función de coincidencias con indicador insensible a mayúsculas y minúsculas)

Parece que las funciones contains y matches funcionan de manera similar aunque las coincidencias permiten indicadores como i para la insensibilidad de mayúsculas y minúsculas.

En otras palabras, estoy consiguiendo los mismos resultados con estas consultas dos 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"/> 

pero me gustaría utilizar matches para devolver resultados que coinciden con "gato" Sólo palabras completas:

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

¿Cómo puedo ajustar la consulta de coincidencias para que coincida con la palabra completa?

EDIT: Olvidé mencionar que todavía necesito usar la función de coincidencias porque necesito el indicador de insensibilidad de mayúsculas y minúsculas.

Respuesta

5

¿Qué hay de usar ^ y $ caracteres como anclajes? se añaden

Dos meta-caracteres, ^ y $:

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

De RegEx Syntax in XQuery 1.0 and XPath 2.0. De forma predeterminada, el meta-carácter ^ coincide con el inicio de la cadena completa, mientras que $ coincide con el final de la cadena completa.

+0

Hmm ... esto me da el resultado que quiero. ¿Pero podrías explicar los^$ anclajes? Nunca los he usado antes ... – developer

+0

Agregué un enlace a una respuesta, vea la sección "Dos metacaracteres ...". –

+1

¡Gracias, todavía necesitaré hacer algunas pruebas, pero esto parece hacer el truco! – developer

2

¿Funcionaría para usted?

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

No exactamente lo que estoy buscando. Todavía quiero usar la función de coincidencias porque necesito insensibilidad de mayúsculas y minúsculas ... (ver edición arriba). – developer

1

Este:

//cat[@*='Cat'] 

resultados en:

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

I verificada utilizando Xacobeo.

+0

No es exactamente lo que estoy buscando. Todavía quiero usar la función de coincidencias porque necesito insensibilidad de mayúsculas y minúsculas ... (ver edición arriba). – developer

+1

@developer Prueba esto: '// gato [traducir (@ *, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = 'cat']' Esto supone que siempre pasa la cadena que desea igualar por minúscula. –

2

Aquí hay tres funciones/operadores relevantes.

coincidencias() hace una coincidencia de expresión regular; puede usarlo para hacer coincidir una subcadena o para hacer coincidir toda la cadena mediante el uso de anclajes (^ cat $), y puede configurar la bandera 'i' para que sea ciega a las mayúsculas y minúsculas.

contiene() hace una coincidencia exacta de una subcadena; puede usar el tercer argumento (colación) para solicitar una coincidencia de caso ciego, pero la forma en que se especifican las intercalaciones depende del procesador que esté utilizando.

El operador eq hace una coincidencia exacta de toda la cadena; la "intercalación predeterminada" (que en el caso de XPath se establecerá normalmente utilizando la API del procesador) se puede utilizar para solicitar la coincidencia de caso ciego.Este parece ser el más cercano a su requerimiento, el único inconveniente es que especificar la intercalación es más dependiente del sistema que usar la bandera "i" con matches().

2

Pero me gustaría utilizar coincidencias para devolver resultados que coinciden con "gato" única palabra entera:

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

Hay diferentes expresión XPath que seleccionar el elemento deseado:

Uso:

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

o usar:

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

XSLT - verificación basadas:

<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> 

cuando se aplica en el documento XML proporcionado:

<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> 

esta transformación evalúa los dos XPath expresiones y copias del elementos seleccionados a la salida:

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