javascript xslt xslt-1.0 exslt node-set

¿Cómo puede hacer que una función de extensión de Javascript XSLT devuelva un conjunto de nodos?



xslt-1.0 exslt (2)

¿Hay una forma simple de tener una función de extensión en XSLT 1.0 escrita en javascript return a node-set?
Podría crear una nueva clase de Java para esto, pero prefiero poner un código en el script.
Cuando esto se puede hacer en otro lenguaje de scripts respaldado por todos o la mayoría de los procesadores XSLT (script VB? Groovy? C #?), Entonces está bien también, por supuesto.

Tengo el siguiente script simple:

<msxsl:script language="JScript" implements-prefix="custom"> function xml (input) { var x = input.split(";"); return x.toString(); } </msxsl:script>

que devuelve una cadena, y por lo tanto, no hay problema para llamar a la función en expresiones Xpath.
Lo que me gustaría tener es un resultado de conjunto de nodos. Pero cuando cambio mi script a

<msxsl:script language="JScript" implements-prefix="custom"> function xml (input) { var x = input.split(";"); return x; } </msxsl:script>

luego llamar a la función genera un error porque la matriz no se convierte automáticamente en un conjunto de nodos.

Miré las matrices-con-java-xslt-extensiones, pero eso está más en la línea de crear una nueva clase para esto, que deseo evitar por ahora.

Entonces, ¿qué declaraciones se deben agregar al script para transformar el conjunto en un conjunto de nodos, permitiendo que la llamada a la función se use en expresiones Xpath?


Si quiere que se devuelvan los nodos, tendrá que crear los nodos usted mismo, usando las interfaces DOM. Sospecho (desde la memoria) que si devuelve un DOM NodeList de su función javascript será tratado por el código XPath llamante como un conjunto de nodos XPath, aunque deberá verificar cuidadosamente las especificaciones para obtener detalles sobre cómo duplican los nodos y el orden de los documentos. son manejados.

Cualquier pregunta sobre XSLT java o las extensiones de Javascript debe indicar de qué producto (s) está hablando, porque no hay estándares aquí.


Aquí hay un ejemplo que debería funcionar con MSXML 6 siempre que se ejecute en un modo que permita al script en XSLT implementar funciones de extensión. El código de la hoja de estilo es el siguiente:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:my="http://example.com/my" exclude-result-prefixes="ms my"> <xsl:output method="html" version="5.0"/> <ms:script language="JScript" implements-prefix="my"> <![CDATA[ function tokenize (input) { var doc = new ActiveXObject(''Msxml2.DOMDocument.6.0''); var fragment = doc.createDocumentFragment(); var tokens = input.split('';''); for (var i = 0, l = tokens.length; i < l; i++) { var item = doc.createElement(''item''); item.text = tokens[i]; fragment.appendChild(item); } return fragment.selectNodes(''item''); } ]]> </ms:script> <xsl:template match="/"> <html> <head> <title>Example</title> </head> <body> <h1>Example</h1> <ul> <xsl:apply-templates select="my:tokenize(''Kibology;for;all'')"/> </ul> </body> </html> </xsl:template> <xsl:template match="item"> <li> <xsl:value-of select="."/> </li> </xsl:template> </xsl:stylesheet>