Frage

Ich möchte etwas wie folgt aus:

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

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

Welcher Rückgabetyp soll ich für getNodes() und was soll ich in seinem Körper?

War es hilfreich?

Lösung

Im Prinzip müssen Sie den XPathNodeIterator verwenden Knotenmengen zurückzukehren (wie Samjudson sagt). Ich nehme an, dass das Beispiel Sie gab eine degenerierte Funktion ist, wie man es nicht mit beliebigen Parametern liefern kann. Aber ich denke, es ist lehrreich die sehen, wie Sie könnte fabrizieren Knoten aus der Luft.

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

Allerdings, in der Regel würden Sie etwas in Ihrer Funktion zu tun, die nicht möglich in Xslt ist, einen Knotensatz auf einige Kriterien wie Filterung. Ein Kriterium, das besser durch den Code implementiert ist oder abhängig om einige externe Datenstruktur. Eine weitere Option ist nur, dass Sie würde einen wortreich Ausdruck zu vereinfachen (wie im Beispiel unten). Dann würden Sie einige Parameter Sie getNodes Funktion übergeben. Der Einfachheit halber verwende ich eine XPath-basierte Filterung, aber es könnte alles sein:

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

hofft, dass dies hilft, Boaz

Andere Tipps

Eine schnelle Google für C # Xslt msxml ergab einen Link auf der folgenden Seite, die in Microsoft-Umgebungen XSLT viele Beispiele erstrecken gibt.

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

Insbesondere der Abschnitt über die Mapping-Typen zwischen XSLT und .Net gibt Ihnen genau die Informationen, die Sie brauchen:

W3C XPath Typ - baugleich .NET-Klasse (Typ)

  • String - System.String
  • Boolean - System.Boolean
  • Number - System.Double
  • Ergebnisbaum-Fragment - System.Xml.XPath.XPathNavigator
  • Node Set - System.Xml.XPath.XPathNodeIterator

So in Ihrem Beispiel würde ich XPathNodeLiterator versuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top