Comment déclarer une fonction définie par l'utilisateur qui retourne un ensemble de noeuds?

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

  •  02-07-2019
  •  | 
  •  

Question

Je veux quelque chose comme ça:

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

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

Quel type de retour dois-je utiliser pour getNodes () et que dois-je mettre dans son corps?

Était-ce utile?

La solution

En principe, vous devez utiliser XPathNodeIterator pour renvoyer des ensembles de nœuds (comme le dit Samjudson). Je suppose que l’exemple que vous avez donné est une fonction dégénérée, car vous ne lui fournissez aucun paramètre. Cependant, je pense qu'il est instructif de voir comment vous pouvez fabriquer des nœuds à partir de rien.

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

Cependant, vous voudrez généralement faire dans votre fonction quelque chose qui n’est pas possible dans xslt, comme filtrer un ensemble de nœuds en fonction de certains critères. Un critère qui est mieux implémenté par le code ou dépend d’une structure de données externe. Une autre option consiste simplement à simplifier une expression verbeuse (comme dans l'exemple ci-dessous). Ensuite, vous transmettriez des paramètres à la fonction getNodes. Pour plus de simplicité, j'utilise un filtrage basé sur XPath, mais cela peut être n'importe quoi:

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

Espère que cela aide, Boaz

Autres conseils

Un rapide Google pour C # xslt msxml a révélé un lien vers la page suivante qui donne de nombreux exemples d’extension de XSLT dans des environnements Microsoft.

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

Plus précisément, la section sur les types de mappage entre XSLT et .Net vous donne exactement les informations dont vous avez besoin:

Type W3C XPath - Classe .NET équivalente (Type)

  • String - System.String
  • Boolean - System.Boolean
  • Numéro - System.Double
  • Fragment d'arborescence des résultats - System.Xml.XPath.XPathNavigator
  • Ensemble de nœuds - System.Xml.XPath.XPathNodeIterator

Donc, dans votre exemple, je voudrais essayer XPathNodeLiterator.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top