2011-12-06 13 views
5

Necesito convertir la cadena 'abcdef' a sus partes, 'a', 'b', 'c', 'd', 'e', ​​'f'. Estúpidamente intenté tokenize ('abcdef', '') pero, por supuesto, devuelve un error FORX0003 (La expresión regular en tokenize() no debe coincidir con una cadena de longitud cero).En XSLT, ¿puedo tokenizar con nada?

Estoy tratando de convertir la cadena finalmente en 'a/b/c/d/e/f', así que cualquier atajo que me lleve directamente a este estado también sería útil.

(estoy usando Saxon 9.3 para la plataforma .NET)

Respuesta

2

uso de esta línea:

replace(replace($input, "(.)", "$1/", "s"), "(.*).$", "$1", "s") 

Dónde $input puntos en su cadena original. El regreso de esta línea es tu cadena deseada.

a/b/c/d/e/f 
5

Para obtener la secuencia de caracteres que desee de una cadena $str utilizar el par de funciones string-to-code-points() y codepoints-to-string():

for $c in string-to-codepoints($str) 
return 
    codepoints-to-string($c) 

Para llegar esta secuencia de caracteres unida con '/' como cadena de unión, simplemente aplique string-join() en la expresión anterior.

Aquí es un ejemplo de código completo:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select= 
     "string-join(
       for $c in string-to-codepoints('ABC') 
       return 
       codepoints-to-string($c), 
      '/' 
        ) 
     "/> 
</xsl:template> 
</xsl:stylesheet> 

produce la secuencia deseada carácter:

A/B/C 

Explicación:

string-to-codepoints($str) produce una secuencia de puntos de código (piénselos como "códigos de caracteres") que representan cada carácter de la cadena.

Por ejemplo;

string-to-codepoints('ABC') 

produce la secuencia de:

65 66 67 

codepoints-to-string($code-seq) 

es la función inversa de string-to-codepoints(). Dada una secuencia de puntos de código, produce la cadena, cuyos caracteres están representados por los puntos de código en la secuencia. Por lo tanto:

codepoints-to-string((65,66,67)) 

produce la cadena:

ABC 

Por lo tanto:

for $c in string-to-codepoints($str) 
return 
    codepoints-to-string($c) 

obtiene el punto de código de cada carácter individual en $str y la convierte en una cadena separada.

Usando string-join(), entonces unimos todas las cadenas separadas usando el carácter de unión proporcionado "/".

+0

Esta solución funciona perfectamente, pero he aceptado la respuesta de FailedDev ya que es más corto y un poco más fácil para las personas (simples) (como yo) para entender –

+0

@TheArtfulBenny: Más fácil de entender ??? Usted debe estar bromeando. –