xsl values template example content xml xslt xslt-1.0

xml - values - xslt



Eliminar caracteres utilizando xsl (2)

Simplemente necesita translate(//foo/@value, ''*/%!@$&'', '''') En XPath, respectivamente, dentro de un documento XML como una hoja de estilo XSLT que necesita para escapar del ampersand <xsl:value-of select="translate(//foo/@value, ''*/%!@$&amp;'', '''')"/> .

Necesito eliminar los siguientes caracteres de un valor de cadena usando xsl 1.0

*, /, /, #, %, !, @, $, (, ), &

Se me ha ocurrido lo siguiente:

translate(translate(translate(string(//xpath/@value),''.'',''''),''/'',''''),'','','''')

En el enfoque anterior, tendría que duplicar el mismo código muchas veces (una vez por carácter).

¿Cómo puedo lograr el mismo objetivo sin duplicar el código?

Gracias :-)


La función translate() acepta como segundo y tercer argumento dos cadenas , no solo dos caracteres .

translate(., $string1, '''')

produce una cadena que es el valor de cadena del contexto (actual) nodo en el que se elimina cualquier aparición de un carácter que está en $string1 .

Por lo tanto puedes usar :

translate(expressionSelectingNode, "//#%!@$()&", "")

para borrar cualquiera de los caracteres contenidos en el segundo argumento .

Por supuesto, si la función translate() se usa dentro de una hoja de estilo XSLT (o, generalmente dentro de un documento XML), algunos caracteres especiales, como < y & deben escaparse respectivamente como &lt; y &amp; .

Usar esto es tan poderoso, que uno puede eliminar un conjunto de caracteres desconocidos :

Imagina que deseas eliminar de cualquier cadena todos los caracteres que no sean numéricos. No sabemos de antemano qué caracteres estarían presentes en la cadena, por lo tanto, no podemos simplemente enumerarlos en el segundo argumento de translate() . Sin embargo, todavía podemos eliminar todos estos caracteres desconocidos así:

translate(., translate(., ''0123456789'', ''''), '''')

La translate() interna translate() produce la cadena sin dígitos.

La translate() externa translate() elimina todos los caracteres sin dígitos (encontrados por la translate() interna translate() ) de la cadena original; por lo tanto, lo que queda son solo los caracteres de los dígitos.