http://bugzilla.novell.com/show_bug.cgi?id=560002
http://bugzilla.novell.com/show_bug.cgi?id=560002#c0 Summary: Element-backed node-sets can't be used within XSLT. Classification: Mono Product: Mono: Class Libraries Version: SVN Platform: x86-64 OS/Version: openSUSE 11.2 Status: NEW Severity: Normal Priority: P5 - None Component: Sys.XML AssignedTo: [email protected] ReportedBy: [email protected] QAContact: [email protected] Found By: --- Blocker: --- https://bugzilla.novell.com/show_bug.cgi?id=559957 for elements, not documents. Consider the following program: using System; using System.IO; using System.Xml; using System.Xml.Linq; using System.Xml.XPath; using System.Xml.Xsl; class Test { public static void Main () { string xsl = @"<xsl:stylesheet version='1.0' exclude-result-prefixes='msxsl' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl='urn:schemas-microsoft-com:xslt' > <xsl:param name='Index' /> <xsl:template match='/'> <root> <xsl:variable name='t'> <xsl:call-template name='get-bar'> <xsl:with-param name='type' select=""'Mono.DocTest.Color'"" /> </xsl:call-template> </xsl:variable> <xsl:value-of select='msxsl:node-set($t)/Type/@Name' /> </root> </xsl:template> <xsl:template name='get-bar'> <xsl:param name='type' /> <xsl:for-each select='$Index/Types/Namespace/Type'> <xsl:variable name='nsp'> <xsl:choose> <xsl:when test='string-length (parent::Namespace/@Name) = 0' /> <xsl:otherwise> <xsl:value-of select='parent::Namespace/@Name' /> <xsl:text>.</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test=""concat($nsp, translate(@Name, '+', '.')) = $type""> <Type Name='{...@name}' Namespace='{parent::Namespace/@Name}' /> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>"; var overview = GetOverview (); var args = new XsltArgumentList (); args.AddParam ("Index", "", overview.DocumentElement.CreateNavigator ()); var t = new XslCompiledTransform (); t.Load (new XPathDocument (new StringReader (xsl))); t.Transform ( new XPathDocument ( new XmlTextReader ( new StringReader ( "<root><foo attr='A'/><foo attr='B'/><foo attr='C'/></root>"))), args, Console.Out); Console.WriteLine(); } static XmlDocument GetOverview () { var doc = new XmlDocument (); var overview = doc.CreateElement ("Overview"); doc.AppendChild (overview); var types = doc.CreateElement ("Types"); overview.AppendChild (types); var ns = doc.CreateElement ("Namespace"); types.AppendChild (ns); var name = doc.CreateAttribute ("Name"); name.Value = "Mono.DocTest"; ns.Attributes.Append (name); var t = doc.CreateElement ("Type"); ns.AppendChild (t); name = doc.CreateAttribute ("Name"); name.Value = "Color"; t.Attributes.Append (name); var k = doc.CreateAttribute ("Kind"); k.Value = "Enumeration"; t.Attributes.Append (k); return doc; } } Under Mono, this prints: <?xml version="1.0" encoding="utf-8"?><root></root> NET prints: <?xml version="1.0" encoding="IBM437"?><root>Color</root> [Aside: Why does .NET default to IBM437 as the code page?!] Notice that .NET finds the $Index/Types/Namespace/Type node (from the XPath on line 30), while Mono does not. As with #559957, the workaround under Mono is to use $Index//Type. If we take a page out of https://bugzilla.novell.com/show_bug.cgi?id=559987, and use an XElement-backed XPathNavigator (replacing line 46-48 with the following): var overview = new XElement ("Overview", new XElement ("Types", new XElement ("Namespace", new XAttribute ("Name", "Mono.DocTest"), new XElement ("Type", new XAttribute ("Name", "Color"), new XAttribute ("Kind", "Enumeration"))))); var args = new XsltArgumentList (); args.AddParam ("Index", "", overview.CreateNavigator ()); Mono generates the same wrong output as with the above overview.DocumentElement (for an XPath on line 30 of $Index/Types/Namespace/Type), while .NET produces the same correct output as with the above overview.DocumentElement code. Furthermore, just as in #559987, if we change line 30 to be $Index//Type, we get a NullReferenceException with what looks like the same stack trace. -- Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the QA contact for the bug. _______________________________________________ mono-bugs maillist - [email protected] http://lists.ximian.com/mailman/listinfo/mono-bugs
