Как объявить определяемую пользователем функцию, возвращающую набор узлов?
Вопрос
Я хочу что-то вроде этого:
<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.