Как объявить пользовательскую функцию, возвращающую набор узлов?

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

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

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

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

2 ответа

Решение

В принципе вам нужно использовать 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>

Надеется, что это помогает, Вооз

Быстрый 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.Xml.XPath.XPathNavigator
  • Набор узлов - System.Xml.XPath.XPathNodeIterator

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

Другие вопросы по тегам