¿Cómo declarar una función definida por el usuario devolviendo el conjunto de nodos?
Pregunta
Quiero algo como esto:
<msxsl:script language="C#">
??? getNodes() { ... return ... }
</msxsl:script>
<xsl:for-each select="user:getNodes()">
...
</xsl:for-each>
¿Qué tipo de devolución debo usar para getNodes ()
y qué debo poner en su cuerpo?
Solución
En principio, debe usar el XPathNodeIterator para devolver los conjuntos de nodos (como dice Samjudson). Supongo que el ejemplo que dio es una función degenerada, ya que no le proporciona ningún parámetro. Sin embargo, creo que es instructivo ver cómo podrías fabricar nodos de la nada.
<msxsl:script language="C#">
XPathNodeIterator getNodes()
{
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.LoadXml("<root><fld>val</fld><fld>val2</fld></root>");
return doc.CreateNavigator().Select("/root/fld");
}
</msxsl:script>
Sin embargo, normalmente querrá hacer algo en su función que no sea posible en xslt, como filtrar un conjunto de nodos según algunos criterios. Un criterio que se implementa mejor a través del código o depende de alguna estructura de datos externa. Otra opción es simplemente que simplificaría una expresión verbal (como en el ejemplo a continuación). Luego pasarías algunos parámetros a tu función getNodes. Para simplificar, uso un filtro basado en XPath, pero podría ser cualquier cosa:
<msxsl:script language="C#">
XPathNodeIterator getNodes(XPathNodeIterator NodesToFilter, string Criteria)
{
XPathNodeIterator x = NodesToFilter.Current.Select("SOMEVERYCOMPLEXPATH["+Criteria+"]");
return x;
}
</msxsl:script>
<xsl:for-each select="user:getNodes(values/val,'SomeCriteria')">
...
</xsl:for-each>
Espera que esto ayude, Boaz
Otros consejos
Un google rápido para C # xslt msxml reveló un enlace a la siguiente página que ofrece muchos ejemplos de extensión de XSLT en entornos de Microsoft.
http://msdn.microsoft.com/en-us/magazine /cc302079.aspx
Específicamente, la sección sobre tipos de mapeo entre XSLT y .Net le brinda exactamente la información que necesita:
Tipo XPath W3C - Clase de .NET equivalente (Tipo)
- Cadena - System.String
- Booleano - System.Boolean
- Número - System.Double
- Fragmento del árbol de resultados - System.Xml.XPath.XPathNavigator
- Conjunto de nodos - System.Xml.XPath.XPathNodeIterator
Entonces, en tu ejemplo, probaría XPathNodeLiterator.