[Mono-bugs] [Bug 560002] New: Element-backed node-sets can't be used within XSLT.

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


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: atsushi at ximian.com
        ReportedBy: jpryor at novell.com
         QAContact: mono-bugs at lists.ximian.com
          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.


More information about the mono-bugs mailing list