Come dichiarare una funzione definita dall'utente che restituisce il set di nodi?

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

  •  02-07-2019
  •  | 
  •  

Domanda

Voglio qualcosa del genere:

<msxsl:script language="C#">
   ??? getNodes() { ... return ... }
</msxsl:script>

<xsl:for-each select="user:getNodes()">
    ...
</xsl:for-each>

Quale tipo di ritorno dovrei usare per getNodes () e cosa dovrei inserire nel suo corpo?

È stato utile?

Soluzione

In linea di principio è necessario utilizzare XPathNodeIterator per restituire set di nodi (come dice Samjudson). Presumo che l'esempio che hai dato sia una funzione degenerata, in quanto non lo fornisci con alcun parametro. Tuttavia, penso che sia istruttivo vedere come potresti fabbricare nodi dal nulla.

<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>

Tuttavia, in genere vorresti fare qualcosa nella tua funzione che non è possibile in xslt, come filtrare un set di nodi in base ad alcuni criteri. Un criterio che è meglio implementato tramite codice o dipende da una struttura di dati esterna. Un'altra opzione è proprio quella di semplificare un'espressione prolissa (come nell'esempio qui sotto). Quindi passereste alcuni parametri alla funzione getNodes. Per semplicità uso un filtro basato su XPath ma potrebbe essere qualsiasi 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>

Spero che questo aiuti, Boaz

Altri suggerimenti

Un rapido google per C # xslt msxml ha rivelato un collegamento alla pagina seguente che fornisce molti esempi di estensione di XSLT in ambienti Microsoft.

http://msdn.microsoft.com/en-us/magazine /cc302079.aspx

In particolare la sezione sui tipi di mappatura tra XSLT e .Net ti fornisce esattamente le informazioni di cui hai bisogno:

Tipo XPath W3C - Classe .NET equivalente (tipo)

  • String - System.String
  • Booleano - System.Boolean
  • Numero - System.Double
  • Frammento dell'albero dei risultati - System.Xml.XPath.XPathNavigator
  • Set di nodi - System.Xml.XPath.XPathNodeIterator

Quindi nel tuo esempio proverei XPathNodeLiterator.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top