[Mono-bugs] [Bug 560064] New: Variable containing result-tree-fragment should be true()

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Wed Dec 2 14:52:29 EST 2009


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

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


           Summary: Variable containing result-tree-fragment should be
                    true()
    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 an incompatibility with .NET.

If an <xsl:variable/> is initialized to contain the result of an
<xsl:call-template/> (which returns nothing), Mono treats the value as having a
false() value within boolean expressions, while .NET treats it as having a
true() value.  Consider:

  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:param name='Index' />
    <xsl:template match='/'>
      <root>
      <xsl:variable name='b'>
        <xsl:call-template name='get-bar'>
          <xsl:with-param name='type' select=""'Mono.DocTest.Color'"" />
        </xsl:call-template>
      </xsl:variable>
      <xsl:if test='$b'>
        <b hasvalue='true' />
      </xsl:if>
      </root>
    </xsl:template>
    <xsl:template name='get-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();
    }
  }

The output under Mono:

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

The output under .NET:

  <?xml version="1.0" encoding="IBM437"?><root><b hasvalue="true" /></root>

Notice that .NET treats <xsl:if test="$b" /> as being true(), not false(), even
though $b doesn't actually contain anything.

To make .NET behave like Mono, the result tree fragment needs to be converted
into a string, e.g.:  <xsl:if test="string($b)" />

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