2010-06-16 15 views
5

que tiene un XML comoconversión minúsculas en XSL

<emps> 
<emp id='3432'> 
<fname>Jack</fname> 
<lname>Dawson</lname> 
<emp> 
<emp id='1122'> 
<fname>Jack</fname> 
<lname>Thompson</lname> 
<emp> 
<emps> 

Estoy desarrollando una aplicación web que busca en este XML basado en el primer nombre introducido y viene con una página resultante. Para lograr esto, he escrito un xslt para transformar el XML en HTML basado en la cadena de búsqueda de entrada que se pasa como una variable llamada srchStr.

<xsl:template match="employees"> 
    <xsl:for-each select="emp[fname=$srchStr]"> 
<tr> 
    <xsl:variable name="id"> 
    <xsl:value-of select="@id" /> 
    </xsl:variable> 
    <td> 
    <a href='detailSearch.do?id={$id}'> 
    <xsl:value-of select="fname" /> 
    , 
    <xsl:value-of select="lname" /> 
    </a> 
    </td> 

    </tr> 
</xsl:for-each 
</xsl:template> 

Pero el usuario puede ingresar el nombre en mayúsculas o minúsculas. Entonces, ¿cómo convertir el primer nombre dentro de la etiqueta xml fname a minúsculas y hacer la comparación?

¿Alguien puede poner un fragmento de código para usar fn:lower-case dentro de mi xsl.

+1

duplicados de http://stackoverflow.com/questions/586231/how-can-i-convert -a-string-to-upper-o-min-case-with-xslt –

Respuesta

10

para convertir una cadena a minúsculas o en mayúsculas puede utilizar la función XPath 1.0 translate:

En primer lugar definir sus alfabetos de minúsculas y mayúsculas. Tenga en cuenta que la posición de cada par de caracteres tiene que ser la misma:

<xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable> 
<xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> 

A continuación, puede convertir a mayúsculas:

<xsl:value-of select="translate($toconvert,$lcletters,$ucletters)"/> 

o en minúsculas

<xsl:value-of select="translate($toconvert,$ucletters,$lcletters)"/> 
+0

Esto no funciona cuando no hay una correspondencia uno a uno entre letras minúsculas y mayúsculas. El alemán ettsett (ß) es exclusivamente en minúscula y la versión en mayúscula es "SS". (Dos letras "S") Teniendo en cuenta el número de letras Unicode y la probabilidad de que incluso los sitios/servicios solo para EE. UU. Encuentren a alguien con acentos en sus nombres, esta es una solución inviable a menos que solo le interesen las ortografías anglicanizadas de nombres. – yam655

+0

@ yam655: De hecho, la traducción de un solo carácter en dos caracteres no funcionará con este enfoque. Una opción podría ser agregar una asignación al carácter de código Unicode LATIN CAPITAL LETTER SHARP S (U + 1E9E) que se ha agregado en 2008. Por cierto, los caracteres acentuados funcionarán, solo tienen que estar en la lista como Tomalak señaló. Pero, después de todo, XSLT/XPath 1.0 es una plataforma muy limitada, y ciertamente recomendaría hacer conversiones de casos usando una biblioteca dedicada con buen soporte para I18N. –

+0

que solo muestra el problema con el enfoque translate(). Una vez que trabajas con idiomas distintos al inglés, comienzas a tener múltiples asignaciones para cosas que son lingüísticamente iguales. En alemán, "ß" debe comparar lo mismo que "ss", pero la gente puede adivinar eso. Los problemas más grandes provienen de las letras acentuadas, donde tiene la posibilidad de un conjunto de acentos que no avanzan sobre una letra base frente a un solo punto de código. ('Ê' frente a '^' no avanzado y el 'E' estándar, etc.) Acepto, es mejor usar una biblioteca con soporte explícito de I18N. IMO, translate() debe ser evitado. – yam655

4

emp[lower-case(fname)=lower-case($srchStr)]

O, si solo tiene XPath 1.0, puede intentar usar translate como aquí: http://geekswithblogs.net/TimH/archive/2006/07/06/84229.aspx

Se advierte sin embargo, el ejemplo con translate no funcionaría en los nombres con acentos (como la mía :)

+1

'translate()' funciona en caracteres acentuados. Simplemente tienen que estar en la lista. – Tomalak

+0

@Tomalak: por supuesto, quise decir el ejemplo específico que he vinculado. –

+0

y @Tomalak: ¡Gracias a los dos por ayudarme! – Bala