A mi parecer, una de las cosas que hecho de menos en DirXML es la creación de tipos de variables complejas.DirXML no es un lenguaje tipado por lo que cualquier variable puede contener todo tipo de valor, esto resulta una ventaja en muchos casos , pero en otros presenta algunos inconvenientes.
Durante el desarollo de un conector , me encontré con la necesidad de usar algun tipo de dato un poco mas complejo, quería algo parecido a un array o una lista enlazada.En concreto quería encontrar una forma de buscar un valor en una lista de una forma rápida y cómoda sin tener que escribir el código para recorrerla.
La solución que finalmente implementé fue crear una cadena de valores separados por un carácter, como en mi caso los valores eran únicamente numéricos me bastó con utilizar el carácter – como separador. En mi caso los valores provenían de una query SQL , un bucle for-each cojia los valores de dicho resultado y los iba concatenando separados por el carácter de separación ‘-’
<do-for-each>
<arg-node-set>
<token-xpath expression=‘jdbc:row/jdbc:column[@jdbc:name="atributo"]‘/>
</arg-node-set>
<arg-actions>
<do-set-local-variable name=“lista” scope=“driver”>
<arg-string>
<token-local-variable name=“lista“/>
<token-text xml:space=“preserve”>-</token-text>
<token-xpath expression=“$current-node/jdbc:value”/>
</arg-string>
</do-set-local-variable>
</arg-actions>
</do-for-each>
Ahora la pregunta sería como consultarla , en mi caso sólo necesito saber si existe el valor en la lista, para ello uso la función contains() de xpath,dicha función devuelve true si encuentra dentro de una cadena una subcadena pasada como parámetro
El carácter de separación se usa para poder buscar los valores , si queremos un 2 por ejemplo buscamos -2- y así nos aseguramos de que no cogemos el 22 o el 200.
Para ello modificamos el valor de la variable , dejanadolo entre el carácter de separación ‘-’
<do-set-local-variable name=“item” scope=“policy”>
<arg-string>
<token-text xml:space=“preserve”>-</token-text>
<token-local-variable name=“item“/>
<token-text xml:space=“preserve”>-</token-text>
</arg-string>
</do-set-local-variable>
Y ahora podemos comparar con un simple if, nos devolverá TRUE si esta en la lista o FALSE si no lo esta.
<if-xpath op=“true”>contains($lista,$item)</if-xpath>
Una forma simple de implementar algo parecido a las listas en DirXML