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

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

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

  • Струнная система.Строка
  • Логическая система.Логическое значение
  • Система счисления.Двойной
  • Фрагмент дерева результатов - System.Xml.XPath.XPathNavigator
  • Набор узлов - System.Xml.XPath.Практическое руководство

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top