[Mono-bugs] [Bug 559987] New: Can't use XDocument as a node-set source in XSLT
bugzilla_noreply at novell.com
bugzilla_noreply at novell.com
Wed Dec 2 12:26:21 EST 2009
http://bugzilla.novell.com/show_bug.cgi?id=559987
http://bugzilla.novell.com/show_bug.cgi?id=559987#c0
Summary: Can't use XDocument as a node-set source in 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: atsushi at ximian.com
ReportedBy: jpryor at novell.com
QAContact: mono-bugs at lists.ximian.com
Found By: ---
Blocker: ---
(This is related to https://bugzilla.novell.com/show_bug.cgi?id=559957, but
with an XDocument instead of an XmlDocument.)
If you use an XPathNavigator backed by an XDocument (instead of an
XmlDocument), the XSLT doesn't work.
Consider:
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 = new XDocument (
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 ());
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();
}
}
The above source differs from
https://bugzilla.novell.com/show_bug.cgi?id=559957 in two ways:
1. The XPath expression is $Index/Types/Namespace/Type (i.e. the buggy Mono
behavior which should be replaced with $Index/Overview/Types/Namespace/Type for
NET use)
2. We're using an XDocument instead of an XmlDocument to provide the
XPathNavigator.
The problem is the output:
<?xml version="1.0" encoding="utf-8"?><root></root>
It should be '<root>Color</root>'; if we fix the XPath expression on line 30
(in accordance with #559957), .NET generates:
<?xml version="1.0" encoding="IBM437"?><root>Color</root>
In fact, I can't find any way to get an XDocument-backed XPathNavigator to
actually generate correct output with this app.
Worst of all is if I use the workaround listed in #559957 (change line 30 to
select='$Index//Type'), it crashes with a NullReferenceException:
$ gmcs eno.cs -r:System.Xml.Linq && mono eno.exe
<?xml version="1.0" encoding="utf-8"?><root
Unhandled Exception: System.NullReferenceException: Object reference not set to
an instance of an object
at System.Xml.Linq.XNodeNavigator.get_NodeType () [0x00000] in <filename
unknown>:0
at System.Xml.XPath.NodeNameTest.Match (IXmlNamespaceResolver nsm,
System.Xml.XPath.XPathNavigator nav) [0x00000] in <filename unknown>:0
at System.Xml.XPath.AxisIterator.MoveNextCore () [0x00000] in <filename
unknown>:0
at System.Xml.XPath.BaseIterator.MoveNext () [0x00000] in <filename
unknown>:0
at System.Xml.XPath.SlashIterator.MoveNextCore () [0x00000] in <filename
unknown>:0
at System.Xml.XPath.BaseIterator.MoveNext () [0x00000] in <filename
unknown>:0
at System.Xml.XPath.SortedIterator..ctor (System.Xml.XPath.BaseIterator iter)
[0x00000] in <filename unknown>:0
at System.Xml.XPath.ExprSLASH.Evaluate (System.Xml.XPath.BaseIterator iter)
[0x00000] in <filename unknown>:0
at System.Xml.XPath.Expression.EvaluateNodeSet (System.Xml.XPath.BaseIterator
iter) [0x00000] in <filename unknown>:0
at System.Xml.XPath.CompiledExpression.EvaluateNodeSet
(System.Xml.XPath.BaseIterator iter) [0x00000] in <filename unknown>:0
at System.Xml.XPath.XPathNavigator.Select (System.Xml.XPath.XPathExpression
expr, IXmlNamespaceResolver ctx) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.XslTransformProcessor.Select
(System.Xml.XPath.XPathExpression expr) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslForEach.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslTemplateContent.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.XslTemplate.EvaluateCore (Mono.Xml.Xsl.XslTransformProcessor
p, System.Collections.Hashtable withParams) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.XslTemplate.Evaluate (Mono.Xml.Xsl.XslTransformProcessor p,
System.Collections.Hashtable withParams) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.XslTransformProcessor.CallTemplate
(System.Xml.XmlQualifiedName name, System.Collections.ArrayList withParams)
[0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslCallTemplate.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslTemplateContent.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslVariableInformation.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslLocalVariable.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslTemplateContent.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslLiteralElement.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.Operations.XslTemplateContent.Evaluate
(Mono.Xml.Xsl.XslTransformProcessor p) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.XslTemplate.EvaluateCore (Mono.Xml.Xsl.XslTransformProcessor
p, System.Collections.Hashtable withParams) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.XslTemplate.Evaluate (Mono.Xml.Xsl.XslTransformProcessor p,
System.Collections.Hashtable withParams) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.XslTransformProcessor.ApplyTemplates
(System.Xml.XPath.XPathNodeIterator nodes, System.Xml.XmlQualifiedName mode,
System.Collections.ArrayList withParams) [0x00000] in <filename unknown>:0
at Mono.Xml.Xsl.XslTransformProcessor.Process
(System.Xml.XPath.XPathNavigator root, Mono.Xml.Xsl.Outputter outputtter,
System.Xml.Xsl.XsltArgumentList args, System.Xml.XmlResolver resolver)
[0x00000] in <filename unknown>:0
at System.Xml.Xsl.XslCompiledTransform.Transform
(System.Xml.XPath.XPathNavigator input, System.Xml.Xsl.XsltArgumentList args,
System.IO.TextWriter output) [0x00000] in <filename unknown>:0
at System.Xml.Xsl.XslCompiledTransform.Transform (IXPathNavigable input,
System.Xml.Xsl.XsltArgumentList args, System.IO.TextWriter output) [0x00000] in
<filename unknown>:0
at Test.Main () [0x00000] in <filename unknown>:0
Apparently XLinq + XSLT == FAIL at the moment.
--
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
More information about the mono-bugs
mailing list