如何声明返回节点集的用户定义函数?
时间:2020-03-06 14:55:11 来源:igfitidea点击:
我想要这样的东西:
<msxsl:script language="C#"> ??? getNodes() { ... return ... } </msxsl:script> <xsl:for-each select="user:getNodes()"> ... </xsl:for-each>
我应该为getNodes()使用哪种返回类型,应该在其主体中放入什么?
解决方案
针对Cxslt msxml的快速Google展示了指向下一页的链接,该页面提供了许多在Microsoft环境中扩展XSLT的示例。
http://msdn.microsoft.com/en-us/magazine/cc302079.aspx
特别是有关XSLT和.Net之间的映射类型的部分,将为我们提供所需的确切信息:
W3C XPath类型等效的.NET类(类型)
- 字符串-System.String
- 布尔值-System.Boolean
- 编号-System.Double
- 结果树片段-System.Xml.XPath.XPathNavigator
- 节点集-System.Xml.XPath.XPathNodeIterator
因此,在示例中,我将尝试XPathNodeLiterator。
原则上,我们需要使用XPathNodeIterator返回节点集(如Samjudson所说)。我认为我们给出的示例是一个退化函数,因为我们没有为其提供任何参数。但是,我认为了解如何凭空制造节点是很有启发性的。
<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>
希望这会有所帮助,
波阿斯