www w3schools tutorial example xml xslt

xml - w3schools - XSLT-dividir cadena en cada enésimo carácter en bucle



xslt tutorial (2)

en uno de nuestros requisitos, recibimos una cadena de n caracteres y en el proveedor enviamos eso a SAP. Debido a alguna limitación al final del objetivo, necesitamos verificar si el hilo tiene más de 100 caracteres, tenemos que dividirlo y enviarlo a la aplicación de destino en 2 segmentos diferentes (el mismo nombre), como

entrada - Este es un mensaje de prueba ...... (hasta 150 caracteres)

en la transformación XSLT, tenemos que dividirlo como

<text>first 100 char<text> <text> 101 to 200 char<text> ...

Dado que el número de caracteres no está predefinido, no puedo usar la función de subcadena aquí. Esto debería ser como parte de un bucle ...

Podría alguien por favor ayuda aquí.


Aquí hay una opción para 1.0 (también funciona en 2.0). Utiliza una llamada de plantilla recursiva.

Entrada XML (gracias Michael)

<input>abcde1abcde2abcde3abcde4abcde5abcde6abcde7abcde8abc</input>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="/*"> <output> <xsl:call-template name="tokenize"> <xsl:with-param name="input" select="."/> </xsl:call-template> </output> </xsl:template> <xsl:template name="tokenize"> <xsl:param name="input"/> <xsl:param name="length" select="6"/> <token><xsl:value-of select="substring($input,1,$length)"/></token> <xsl:if test="substring($input,$length+1)"> <xsl:call-template name="tokenize"> <xsl:with-param name="input" select="substring($input,$length+1)"/> </xsl:call-template> </xsl:if> </xsl:template> </xsl:stylesheet>

Salida XML

<output> <token>abcde1</token> <token>abcde2</token> <token>abcde3</token> <token>abcde4</token> <token>abcde5</token> <token>abcde6</token> <token>abcde7</token> <token>abcde8</token> <token>abc</token> </output>


En XSLT 2.0, podrías hacer algo como esto:

Ejemplo simplificado para dividir la entrada en tokens de (hasta) 6 caracteres cada uno.

XML

<input>abcde1abcde2abcde3abcde4abcde5abcde6abcde7abcde8abc</input>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/> <xsl:template match="/"> <output> <xsl:variable name="string" select="input" /> <xsl:for-each select="0 to (string-length($string) - 1) idiv 6"> <token> <xsl:value-of select="substring($string, . * 6 + 1, 6)" /> </token> </xsl:for-each> </output> </xsl:template> </xsl:stylesheet>

Resultado

<output> <token>abcde1</token> <token>abcde2</token> <token>abcde3</token> <token>abcde4</token> <token>abcde5</token> <token>abcde6</token> <token>abcde7</token> <token>abcde8</token> <token>abc</token> </output>