Para una hoja de estilo que estoy escribiendo (en realidad para un conjunto de ellas, cada una generando un formato de salida diferente), tengo la necesidad de evaluar si un cierto valor está presente en una lista de valores. En este caso, el valor que se prueba se toma del atributo de un elemento. La lista que debe probarse proviene de la invocación de la hoja de estilo, y se toma como un nivel superior <xsl:param>
(que se proporcionará en la línea de comandos cuando llamo al xsltproc
o una invocación equivalente de Saxon). Por ejemplo, el valor de entrada puede ser:Prueba del elemento en lista
v0_01,v0_10,v0_99
mientras que los valores de los atributos serán cada parecerse mucho a una dicho valor. (Si una coma se usa para separar valores, o un espacio, no es importante-- Elegí una coma por ahora porque planeo pasar el valor mediante el cambio de línea de comandos al xsltproc
, y usar un espacio requeriría citar el argumento, y soy lo suficientemente flojo como para no querer escribir los dos caracteres adicionales.)
Lo que estoy buscando es algo parecido al grep
de Perl, donde puedo ver si el valor que tengo actualmente está en la lista. Se puede hacer con pruebas de subcadena, pero esto debería ser inteligente para no obtener un falso positivo (v0_01
no debería coincidir con una cadena que contiene v0_011
). Parece que el único tipo de datos no escalar que admite XSL/XSLT es un conjunto de nodos. Supongo que es posible convertir la lista en un conjunto de nodos de texto, pero eso parece exagerar, incluso en comparación con hacer una prueba de subcadena con controles de límites adicionales para evitar coincidencias falsas.
En realidad, para mis propósitos, parece que funcionará la función "contiene" (usando el relleno que sugiera). Lo que me hizo tropezar, fue que estaba buscando esta funcionalidad dentro de XSLT, cuando debería haber estado buscando en XPath. – rjray
Agregué la función contains(), esa me había escapado. Gracias. :-) – Tomalak
@Tomalak: La expresión substring-before() evaluará a '' incluso si el valor está en la lista (cuando es el primer valor). De forma similar, la expresión substring-after() evalúa '' cuando el valor es el último en la lista. Por lo tanto, solo la expresión contains() es correcta –