[xsl] MS XML 3.0 and 4.0 nonconformance

Subject: [xsl] MS XML 3.0 and 4.0 nonconformance
From: gutman@xxxxxxxxxxxxxxxx
Date: Tue, 25 Feb 2003 14:53:02 +0600
Hello, friends.

If we use MS XML 3.0 or 4.0 and transform this:

  <x>
    <y/>
  </x>

via this:

  <t:transform version="1.0"
    xmlns:t="http://www.w3.org/1999/XSL/Transform";
    xmlns:ms="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="ms">

    <t:template match="*" mode="text-check">
      <t:variable name="n" select="count(.//text())"/>
      <t:choose>
        <t:when test="$n=0">no text nodes</t:when>
        <t:otherwise><t:value-of select="$n"/> text nodes</t:otherwise>
      </t:choose>
    </t:template>

    <t:template match="/*">
      <result>
        <original>
          <t:copy-of select="."/>
        </original>
        <original-check>
          <t:apply-templates select="." mode="text-check"/>
        </original-check>
        <t:variable name="rtf">
          <t:copy-of select="."/>
        </t:variable>
        <rtf-nodeset>
          <t:copy-of select="ms:node-set($rtf)/*"/>
        </rtf-nodeset>
        <rtf-nodeset-check>
          <t:apply-templates select="ms:node-set($rtf)/*" 
mode="text-check"/>
        </rtf-nodeset-check>
      </result>
    </t:template>

  </t:transform>

then we obtain:

  <result><original><x>
  <y />
  </x></original><original-check>no text 
nodes</original-check><rtf-nodeset><x>
  <y />
  </x></rtf-nodeset><rtf-nodeset-check>2 text 
nodes</rtf-nodeset-check></result>

or (formatted):

  <result>
    <original>
      <x>
        <y/>
      </x>
    </original>
    <original-check>no text nodes</original-check>
    <rtf-nodeset>
      <x>
        <y/>
      </x>
    </rtf-nodeset>
    <rtf-nodeset-check>2 text nodes</rtf-nodeset-check>
  </result>

As we see, text nodes appear after converting
a node list into an RTF and then back into a node list.
Furthermore, when copied, a node list preserves its
line breaks but looses spaces.

Actually, according to W3C, there should be "2 text nodes"
in the "original-check" as well (!), since no strip-space
elements are set: "Initially, the set of whitespace-preserving
element names contains all element names."

By the way, say, Saxon is fully conformant in this sense:
it shows 2 text nodes in both cases and copies them properly.

-- 
Alexander E. Gutman

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread