[Mono-bugs] [Bug 559994] New: XSLT 1.0 Incompatibility: result tree fragments treatable as node-sets, but shouldn't be

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Wed Dec 2 12:40:12 EST 2009


http://bugzilla.novell.com/show_bug.cgi?id=559994

http://bugzilla.novell.com/show_bug.cgi?id=559994#c0


           Summary: XSLT 1.0 Incompatibility: result tree fragments
                    treatable as node-sets, but shouldn't be
    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: ---


Mono's XSLT allows treating result tree fragments as if they were node sets,
but this is forbidden by the XSLT 1.0 standard (§11.1) and incompatible with
NET.

Quoth the standard http://www.w3.org/TR/xslt#section-Result-Tree-Fragments:

  In particular, it is not permitted to use the /, //, and [] operators on 
  result tree fragments.

Thus, consider the following program:

  using System;
  using System.IO;
  using System.Xml;
  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:template match='/'>
      <root>
      <xsl:variable name='t'>
        <xsl:call-template name='get-type' />
      </xsl:variable>
      <xsl:value-of select='$t/@Name' />
      </root>
    </xsl:template>
    <xsl:template name='get-type'>
      <Type Name='Foo' Namespace='Bar' />
    </xsl:template>
  </xsl:stylesheet>";
      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>"))),
          null,
          Console.Out);
      Console.WriteLine();
    }
  }

Under Mono, it generates:

  <?xml version="1.0" encoding="utf-8"?><root>Foo</root>

Under .NET, it generates:

Unhandled Exception: System.Xml.Xsl.XslTransformException: To use a result tree
fragment in a path expression, first convert it to a node-set using the
msxsl:no
de-set() function.
   at System.Xml.Xsl.Runtime.XsltConvert.EnsureNodeSet(IList`1 listItems)
   at <xsl:template match="/">(XmlQueryRuntime
{urn:schemas-microsoft-com:xslt-d
ebug}runtime)
   at Root(XmlQueryRuntime {urn:schemas-microsoft-com:xslt-debug}runtime)
   at System.Xml.Xsl.XmlILCommand.Execute(Object defaultDocument, XmlResolver
da
taSources, XsltArgumentList argumentList, XmlWriter writer, Boolean
closeWriter)
   at System.Xml.Xsl.XmlILCommand.Execute(IXPathNavigable contextDocument,
XmlRe
solver dataSources, XsltArgumentList argumentList, XmlWriter results)
   at System.Xml.Xsl.XslCompiledTransform.Transform(IXPathNavigable input,
XsltA
rgumentList arguments, TextWriter results)
   at Test.Main()
<?xml version="1.0" encoding="IBM437"?><root>

For user code, they should change line 21 from:

      <xsl:value-of select='$t/@Name' />

to:

      <xsl:value-of select='msxsl:node-set($t)/Type/@Name' />

This generates proper output under both .NET and Mono:

  <?xml version="1.0" encoding="utf-8"?><root>Foo</root>

-- 
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