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