[Bug 4869] [FS] Enclosed expressions and namespaces

http://www.w3.org/Bugs/Public/show_bug.cgi?id=4869


andrew.eisenberg@us.ibm.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |andrew.eisenberg@us.ibm.com,
                   |                            |jim.melton@acm.org




------- Comment #26 from andrew.eisenberg@us.ibm.com  2008-02-26 20:47 -------
How interesting. I used the XQuery 1.0 grammar applet to convert the query
provided in the original entry:

declare copy-namespaces no-preserve, inherit;
<doc>
    <a>{<b xmlns:p="q"/>}</a>
    <a><b xmlns:p="q"/></a>
</doc>

into XQueryX:

<?xml version="1.0"?>
<xqx:module xmlns:xqx="http://www.w3.org/2005/XQueryX"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.w3.org/2005/XQueryX
                                http://www.w3.org/2005/XQueryX/xqueryx.xsd">
  <xqx:mainModule>
    <xqx:prolog>
      <xqx:copyNamespacesDecl>
        <xqx:preserveMode>no-preserve</xqx:preserveMode>
        <xqx:inheritMode>inherit</xqx:inheritMode>
      </xqx:copyNamespacesDecl>
    </xqx:prolog>
    <xqx:queryBody>
      <xqx:elementConstructor>
        <xqx:tagName>doc</xqx:tagName>
        <xqx:elementContent>
          <xqx:elementConstructor>
            <xqx:tagName>a</xqx:tagName>
            <xqx:elementContent>
              <xqx:elementConstructor>
                <xqx:tagName>b</xqx:tagName>
                <xqx:attributeList>
                  <xqx:namespaceDeclaration>
                    <xqx:prefix>p</xqx:prefix>
                    <xqx:uri>q</xqx:uri>
                  </xqx:namespaceDeclaration>
                </xqx:attributeList>
              </xqx:elementConstructor>
            </xqx:elementContent>
          </xqx:elementConstructor>
          <xqx:elementConstructor>
            <xqx:tagName>a</xqx:tagName>
            <xqx:elementContent>
              <xqx:elementConstructor>
                <xqx:tagName>b</xqx:tagName>
                <xqx:attributeList>
                  <xqx:namespaceDeclaration>
                    <xqx:prefix>p</xqx:prefix>
                    <xqx:uri>q</xqx:uri>
                  </xqx:namespaceDeclaration>
                </xqx:attributeList>
              </xqx:elementConstructor>
            </xqx:elementContent>
          </xqx:elementConstructor>
        </xqx:elementContent>
      </xqx:elementConstructor>
    </xqx:queryBody>
  </xqx:mainModule>
</xqx:module>


The constructors for the two a elements are exactly the same.


Looking at the XQueryX schema, I see:

  <xsd:element name="elementContent" type="exprList"/>

  <xsd:complexType name="elementConstructor">
    <xsd:complexContent>
      <xsd:extension base="expr">
        <xsd:sequence>
          <xsd:element name="tagName" type="QName"/>
          <xsd:element ref="attributeList" minOccurs="0"/>
          <xsd:element ref="elementContent" minOccurs="0"/>
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

I don't see any way to write these two constructors any differently to
distinguish them.


Looking further, I see the following rules in the XQueryX stylesheet:

  <xsl:template match="xqx:elementContent">
    <xsl:for-each select="*">
      <xsl:if test="not(self::xqx:elementConstructor)">
         <xsl:value-of select="$LBRACE"/>
      </xsl:if>
      <xsl:apply-templates select="."/>
      <xsl:if test="not(self::xqx:elementConstructor)">
         <xsl:value-of select="$RBRACE"/>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="xqx:elementConstructor">
    <xsl:value-of select="$LESSTHAN"/>
    <xsl:apply-templates select="xqx:tagName"/>
    <xsl:apply-templates select="xqx:attributeList"/>
    <xsl:value-of select="$GREATERTHAN"/>
    <xsl:apply-templates select="xqx:elementContent"/>
    <xsl:value-of select="$LESSTHAN"/>
    <xsl:value-of select="$SLASH"/>
    <xsl:apply-templates select="xqx:tagName"/>
    <xsl:value-of select="$GREATERTHAN"/>
  </xsl:template>

If direct element constructors are nested, then braces will not be generated.
Otherwise, braces are generated.


The upshot of all of this? I believe that if we retain the semantics that cause
these two constructors to create different elements, then XQueryX needs to be
changed.

Received on Tuesday, 26 February 2008 20:48:01 UTC