Pregunta

Necesito poder encontrar la última aparición de un carácter dentro de un elemento.

Por ejemplo:

<mediaurl>http://www.blah.com/path/to/file/media.jpg</mediaurl>

Si trato de localizarlo mediante el uso substring-before(mediaurl, '.') y substring-after(mediaurl, '.') entonces, por supuesto, coincidirá con el primer punto.

¿Cómo obtendría la extensión del archivo?Básicamente, necesito obtener el nombre del archivo y la extensión de una ruta como esta, pero no sé cómo hacerlo usando XSLT.

¿Fue útil?

Solución

El siguiente es un ejemplo de una plantilla que produciría el resultado requerido en XSLT 1.0:

<xsl:template name="getExtension">
<xsl:param name="filename"/>

  <xsl:choose>
    <xsl:when test="contains($filename, '.')">
    <xsl:call-template name="getExtension">
      <xsl:with-param name="filename" select="substring-after($filename, '.')"/>
    </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$filename"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

<xsl:template match="/">
    <xsl:call-template name="getExtension">
        <xsl:with-param name="filename" select="'http://www.blah.com/path/to/file/media.jpg'"/>
    </xsl:call-template>
</xsl:template>

Otros consejos

Si está utilizando XSLT 2.0, es fácil:

 <xsl:variable name="extension" select="tokenize($filename, '\.')[last()]"/>

Si no es así, es un poco más difícil.Hay un buen ejemplo del Libro de cocina XSLT de O'Reilly.Busque "Tokenización de una cadena".

Creo que también hay una función EXSLT, si la tienes disponible.

¿Qué tal tokenizar con "/" y tomar el último elemento de la matriz?

Example: tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")

Fue un violinista XSLT hace algún tiempo...Perdí el contacto ahora.Pero HTH

Como referencia, este problema generalmente se denomina "subcadena después de la última" en XSLT.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top