2009-07-20 42 views
12

Necesito comprobar si una cadena en particular contiene una palabra particular, por ejemplo, para verificar si, SultansOfSwing contiene la palabra Swing.¿Cómo eliminar caracteres particulares de una cadena usando XSLT?

Permítanme mencionar que el valor de la cadena en cuestión es desconocida. Como en él puede ser cualquier palabra, así que no sabemos la longitud, etcétera.

Entiendo que puedo hacer esto utilizando la palabra clave contains.

Pero una vez que sé que esta palabra contiene la palabra clave Swing, quiero mostrar la cadena sin esta palabra "Swing" ... mostrando efectivamente solo "SultansOf".

He estado tratando de explorar cómo puedo lograr esto pero no conseguir ningún avance.

¿Podría alguien aconsejar qué palabra clave o función proporcionará esta instalación? ¿Cómo puedo eliminar una palabra en particular dentro de una cadena?

Gracias por su ayuda con anticipación.

Atentamente.

Dire

Respuesta

1

creo que esta función sustitución de cadenas es bastante exhaustiva:

EDITAR - necesaria para cambiar $ cadena a $ cadena2. En caso de trabajar ahora

<xsl:template name="string-replace"> 
    <xsl:param name="string1"  select="''" /> 
    <xsl:param name="string2"  select="''" /> 
    <xsl:param name="replacement" select="''" /> 
    <xsl:param name="global"  select="true()" /> 

    <xsl:choose> 
    <xsl:when test="contains($string1, $string2)"> 
     <xsl:value-of select="substring-before($string1, $string2)" /> 
     <xsl:value-of select="$replacement" /> 
     <xsl:variable name="rest" select="substring-after($string1, $string2)" /> 
     <xsl:choose> 
     <xsl:when test="$global"> 
      <xsl:call-template name="string-replace"> 
      <xsl:with-param name="string1"  select="$rest" /> 
      <xsl:with-param name="string2"  select="$string2" /> 
      <xsl:with-param name="replacement" select="$replacement" /> 
      <xsl:with-param name="global"  select="$global" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$rest" /> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$string1" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Es mayúsculas y minúsculas, que conste. En su caso:

<xsl:call-template name="string-replace"> 
    <xsl:with-param name="string1"  select="'SultansOfSwing'" /> 
    <xsl:with-param name="string2"  select="'Swing'" /> 
    <xsl:with-param name="replacement" select="''" /> 
</xsl:call-template> 
+0

Gracias por su respuesta .. para explicar mejor mi pregunta, esto es lo que estoy tratando de hacer. Ahora prueba tendrá la valor recuperado de mi consulta SQL y java. Quiero filtrar aún más este valor de variable al ver si hay una palabra que termine con _Swing ... Si lo hace, lo elimino. De lo contrario, lo visualizo. No sé cuál podría ser la palabra recuperada. ¿Podría ayudarme a entender mejor este scenairo? ¿Cómo lograr esto? Gracias –

+1

Los parámetros de esta función pueden ser variables, no es necesario que los codifique, solo ingrese los resultados de sus consultas externas. Si la tarea es solo "devolver todo (antes de cierta cadena)", bastará con una simple línea XPath 'substring-before (concat ($ variable, $ stopword), $ stopword)'. – Tomalak

4

Dado este para la entrada:

<root> 
    <song>SultansOfSwing</song> 
    <song>SwingOfSultans</song> 
    <song>SultansSwingOf</song> 
</root> 

La salida de este:

<?xml version='1.0' ?> 
<root> 
    <swing-less-long>SultansOf</swing-less-long> 
    <swing-less-long>OfSultans</swing-less-long> 
    <swing-less-long>SultansOf</swing-less-long> 
</root> 

puede ser obtenido a partir de esto. Tenga en cuenta el uso de substring-before y substring-after.

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:template match="/"> 
     <root> 
      <xsl:apply-templates select="root/song"/> 
     </root> 
    </xsl:template> 
    <xsl:template match="song"> 
     <swing-less-long> 
      <xsl:if test="contains(., 'Swing')"> 
       <xsl:call-template name="remove"> 
        <xsl:with-param name="value" select="."/> 
       </xsl:call-template> 
      </xsl:if> 
     </swing-less-long> 
    </xsl:template> 
    <xsl:template name="remove"> 
     <xsl:param name="value"/> 
     <xsl:value-of select="concat(substring-before($value, 'Swing'), substring-after($value, 'Swing'))"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Gracias por su respuesta ... para explicar mejor mi pregunta, esto es lo que trato de hacer. Ahora la prueba tendrá el valor recuperado de mi SQL y consulta java Quiero filtrar aún más este valor de variable al ver si hay una palabra que termina con _Swing ... Si lo hace, lo elimino, de lo contrario, lo visualizo. No sé lo que podría ser la palabra. ¿Podrías ayudarme a entender mejor este scenairo? ¿Cómo lograr esto? Gracias –

+0

Elimino solo la parte _Swing si existe else muestra la palabra completa. –

+2

Primero, no haga '' - en su lugar use ''. Esto es mucho más eficiente para el motor XSLT, porque no está creando un documento separado para la variable. Segundo, '' le permitirá filtrar los casos que terminan en su palabra clave. Tercero, 'substring-before ($ test, '_Swing')' devolverá la parte de la cadena sin el sufijo '_Swing'. Todo el resto del código ya está arriba. – lavinio

Cuestiones relacionadas