david wrote:
My problem is I am not sure how to combine several objects that include
string and XPath objects into one XPathNodeIterator.
The easiest way is to build XmlDocument or XPathDocument, then ask it to
create XPathNavigator, select nodelist of values and pass it.
StringWriter sw = new StringWriter();
XmlTextWriter w = new XmlTextWriter(sw);
w.WriteStartElement("root");
for (int i=0; i<10; i++)
w.WriteElementString("val", "value"+i);
w.WriteEndElement();
w.Close();
//XmlNodeWriter should be used instead of temporary string
XPathDocument doc = new XPathDocument(new StringReader(sw.ToString()));
XPathNavigator nav = doc.CreateNavigator();
XsltArgumentList args = new XsltArgumentList();
args.AddParam("array", "", nav.Select("/root/*"));
XPathDocument input = new XPathDocument("foo.xml");
XslTransform xslt = new XslTransform();
xslt.Load("foo.xsl");
xslt.Transform(input, args, Console.Out);
foo.xsl
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:param name="array"/>
<xsl:template match="/">
<out>
<xsl:for-each select="$array">
<xsl:copy-of select="."/>
</xsl:for-each>
</out>
</xsl:template>
</xsl:stylesheet>
The result:
<out>
<val>value0</val>
<val>value1</val>
<val>value2</val>
<val>value3</val>
<val>value4</val>
<val>value5</val>
<val>value6</val>
<val>value7</val>
<val>value8</val>
<val>value9</val>
</out>
--
Oleg Tkachenko
XML Insider
http://www.tkachenko.com/blog