Как объявить пользовательскую функцию, возвращающую набор узлов? - PullRequest
4 голосов
/ 30 сентября 2008

Я хочу что-то вроде этого:

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

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

Какой тип возврата я должен использовать для getNodes() и что я должен поместить в его тело?

Ответы [ 2 ]

4 голосов
/ 05 января 2009

В принципе вам нужно использовать XPathNodeIterator для возврата наборов узлов (как говорит Самджудсон). Я полагаю, что приведенный вами пример является вырожденной функцией, поскольку вы не предоставляете ей никаких параметров. Тем не менее, я думаю, что поучительно посмотреть, как вы могли бы изготовить узлы из воздуха.

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

Однако, как правило, вы захотите сделать что-то в своей функции, что невозможно в xslt, например, фильтрацию набора узлов на основе некоторых критериев. Критерий, который лучше реализовать через код или зависит от некоторой внешней структуры данных. Другой вариант - просто упростить многословное выражение (как в примере ниже). Затем вы передадите некоторые параметры в функцию getNodes. Для простоты я использую фильтрацию на основе XPath, но это может быть что угодно:

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

Надеюсь, это поможет, Боаз

2 голосов
/ 30 сентября 2008

Быстрый Google для C # xslt msxml обнаружил ссылку на следующую страницу, которая дает множество примеров расширения XSLT в средах Microsoft.

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

В частности, раздел о типах сопоставления между XSLT и .Net дает именно ту информацию, которая вам нужна:

Тип W3C XPath - эквивалентный класс .NET (тип)

  • String - System.String
  • Boolean - System.Boolean
  • Номер - System.Double
  • Фрагмент дерева результатов - System.Xml.XPath.XPathNavigator
  • Набор узлов - System.Xml.XPath.XPathNodeIterator

Так что в вашем примере я бы попробовал XPathNodeLiterator.

...