2009-12-05 27 views
7

Im tratando de usar las funciones XSL y Xpath para eliminar todo el espacio en blanco de un atributo XML llamado nombre y hacerlo en minúsculas. Por el momento tengo algo así comoFunción Xpath para eliminar el espacio en blanco

<xsl:variable name="linkName"> 
<xsl:value-of select="normalize-space(name)"/> 
</xsl:variable> 

Esto elimina el espacio en blanco al principio y al final, pero no en el centro. ¿Alguna sugerencia?

¿Cuál es la mejor práctica para la manipulación y alteración de datos XML, ya que parece que se puede utilizar

<xsl:value-of select="x"/> 

colocado directamente en el HTML

o

<xsl:attribute name="y"> 
<xsl:value-of select="x"/> 

o utilizar un

<xsl:variable name="x"> 

No estoy seguro de las diferencias o cuándo se deben usar. Cualquier ayuda es muy apreciada.

aliado

+1

Solo un punto de aclaración, normalize-space() eliminará los caracteres duplicados de espacio en blanco (espacio, tabulación y/o retorno de carro) en el medio de la cadena y los convertirá en un espacio único. –

Respuesta

6

Como señala Tim Robinson, translate hará el truco. (No lo llamaría un "hack", pero luego estuve en la etapa de identificación con mis torturadores de mi relación con XSLT). Su código será mucho más legible si usa algo como esto :

<xsl:variable name="uc" value="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/> 
<xsl:variable name="lc" value="abcdefghijklknopqrstuvwxyz"/> 
<xsl:variable name="ws" value=" &#13;&#10;&#09"/> 

... que es parte del archivo globals.xslt que incluyo en la parte superior de la mayoría de las transformaciones que escribo. Luego esto:

<xsl:value-of select="translate(x, concat($uc, $ws), $lc)"/> 

traduce cada letra mayúscula en su equivalente en minúscula y cada carácter en blanco en nada.

Por lo general, la razón por la que utiliza xsl:variable es hacer que el código sea más legible (como en el ejemplo anterior), o para almacenar resultados intermedios que de otro modo no se pueden calcular efectivamente. Una cuarta forma de obtener datos en el resultado es uno que no mencionó, y eso es bastante útil: la plantilla de valor de atributo. Todos ellos hacen lo mismo:

<link> 
    <xsl:attribute name="name"> 
     <xsl:value-of select="translate(name, concat($uc, $ws), $lc)"/> 
    </xsl:attribute> 
</link> 

<link> 
    <xsl:attribute name="name" value="translate(name, concat($uc, $ws), $lc)"/> 
</link> 

<xsl:variable name="linkName" value="translate(name, concat($uc, $ws), $lc)"/> 
<link name="{$linkName}"/> 

En este caso particular, es discutible cuál de los dos últimos es más sencillo y claro. La mayoría de las veces, sin embargo, no lo es: separar el cálculo de los valores de cómo se insertan en el resultado hace que ambos sean más fáciles de comprender, al igual que el uso de un AVT en lugar de construcciones XSLT más detalladas que hacen lo mismo.

3

Esto elimina el espacio en blanco al principio y al final, pero no el medio. ¿Alguna sugerencia?

Puede usar el translate(' &#13;&#10;', '') para quitar los caracteres de espacio, línea nueva y retorno de carro. Si está utilizando las clases .NET o MSXSL para hacer su transformación, entonces es un poco difícil convertir los caracteres en minúsculas. Un truco que he usado es usar transform para convertir letras mayúsculas a sus contrapartes minúsculas; otra es escribir un objeto de extensión .NET para proporcionar una función lower-case. La función lower-case está integrada en XPath/XSL 2.0.

En la segunda parte de su pregunta, que hacen cosas diferentes:

  • <xsl:value-of ... otorga un valor directamente en el HTML
  • <xsl:attribute ... crea un atributo en el elemento HTML actual y le asigna un valor
  • <xsl:variable ... declara una variable XSL sin afectar el HTML. Puede escribir esta variable en el HTML utilizando <xsl:value-of select="$x"/>.
Cuestiones relacionadas