¿Cómo declarar una función definida por el usuario devolviendo el conjunto de nodos?

StackOverflow https://stackoverflow.com/questions/152822

  •  02-07-2019
  •  | 
  •  

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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top