2012-01-23 40 views
5

Estoy usando XPATH para seleccionar ciertos nodos de un documento XML.XPath minúsculas() función

El usuario puede insertar un valor para la ubicación. Funciona bien, pero no funciona si se usan casos diferentes.

He decidido que cambiar los valores XML y la información del usuario en minúsculas antes de compararlos es probablemente la mejor manera de hacerlo.

Tengo esto como mi selector de piso en la actualidad

NodeIter = nav.Select("/Houses/House/location[contains(../location, '" + location_input + "')]"); 

He intentado poner la función lower-case() en varios lugares, pero no es feliz con él.

¿Cómo hago para que el valor de ../location se compare en minúsculas?

Nota: la ubicación_input está configurada para bajar usando ToLower() dentro de mi código C#.

+1

¿Qué quiere decir con "no está contento con eso"? – BoltClock

Respuesta

17

La función lower-case() solo es compatible desde XPath 2.0 en adelante. Si el entorno es compatible con esta versión de la norma, puede escribir:

NodeIter = nav.Select("/Houses/House/location[contains(lower-case(.), '" 
    + location_input + "')]"); 

Sin embargo, es probable que le pegan con XPath 1.0. En ese caso, se puede abusar de la función translate():

NodeIter = nav.Select("/Houses/House/location[contains(translate(., " 
    + "'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '" 
    + location_input + "')]"); 
4

translate(../location, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') si usted puede conseguir lejos con sólo AZ

2

lower-casehttp://www.w3.org/TR/xpath-functions/#func-lower-case es parte de XPath 2.0 y XQuery 1.0 por lo que es necesario utilizar un XPath 2.0 o XQuery 1.0 aplicación como XQSharp o igual que la versión .NET de Saxon 9 si quieres usar tales funciones

Con XPath 1.0 todo lo que puedes hacer es NodeIter = nav.Select(string.Format("/Houses/House/location[contains(translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXZY', 'abcdefghijklmnopqrstuvwxyz'), '{0}')]", location_input));.

2

Nota que, estrictamente hablando, la traducción de dos cuerdas para bajar (o superior) caso no es una forma correcta de hacer una comparación de casos y ciego, porque la asignación de los caracteres de mayúscula a minúscula en Unicode no son uno a uno. En principio, en XPath 2.0 debe usar una intercalación de casos ciegos. Desafortunadamente, aunque muchos procesadores XSLT 2.0 y XQuery 1.0 le permiten utilizar una intercalación de mayúsculas y minúsculas, no hay estándares para URI de intercalación, por lo que su código depende del procesador.

0

tuve mismo dilema usando VS2017 (NetFramework 4.6.1) e instaló el paquete XPath2 NuGet. Hasta ahora me ha funcionado bien cuando uso las funciones de XPath2.

Cuestiones relacionadas