This is an archived snapshot of W3C's public bugzilla bug tracker, decommissioned in April 2019. Please see the home page for more details.

Bug 11325 - [XSLT 2.0] Base URIs for copied nodes strangely inconsistent
Summary: [XSLT 2.0] Base URIs for copied nodes strangely inconsistent
Status: CLOSED WONTFIX
Alias: None
Product: XPath / XQuery / XSLT
Classification: Unclassified
Component: XSLT 2.0 (show other bugs)
Version: Recommendation
Hardware: All Windows 3.1
: P2 normal
Target Milestone: ---
Assignee: Michael Kay
QA Contact: Mailing list for public feedback on specs from XSL and XML Query WGs
URL: http://www.w3.org/TR/xslt20/#shallow-...
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2010-11-16 15:04 UTC by Henry Zongaro
Modified: 2012-06-25 21:00 UTC (History)
0 users

See Also:


Attachments

Description Henry Zongaro 2010-11-16 15:04:33 UTC
Consider the following stylesheet

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:template match="/" xml:base="http://wonka.com/">
    <xsl:variable name="v" as="element()*">
      <xsl:copy-of select="doc/ch"/>

      <xsl:copy-of select="doc/ch/gch"/>

      <xsl:for-each select="doc/ch">
        <xsl:copy>
          <xsl:copy-of select="@*"/>
        </xsl:copy>
      </xsl:for-each>

      <xsl:for-each select="doc/ch/gch">
        <xsl:copy>
          <xsl:copy-of select="@*"/>
        </xsl:copy>
      </xsl:for-each>
    </xsl:variable>

    <out>
      <xsl:value-of select="for $i in $v return base-uri($i)"/>
    </out>
  </xsl:template>
</xsl:stylesheet>

and input document

<doc xml:base="http://example.com/foo"><ch xml:base="bar/baz"><gch/></ch></doc>

According to the penultimate paragraph of 11.9.1,[1] "The base URI of a node is copied, except in the case of an element node having an xml:base attribute, in which case the base URI of the new node is taken as the value of the xml:base attribute, resolved if it is relative against the base URI of the xsl:copy instruction."  The last paragraph of 11.9.2[2] contains the same text, with xsl:copy-of replacing xsl:copy.

So I believe that means the output in this case should be:

<?xml version="1.0" encoding="UTF-8"?><out>http://wonka.com/bar/baz http:/
/example.com/bar/baz http://wonka.com/bar/baz http://example.com/bar/baz</out>

Draft erratum XT.E42 - raised for bug 8219 - changes the text in 11.9.1 to "When a node is copied, its base URI is copied, except when the result of the xsl:copy instruction is an element node having an xml:base attribute, in which case the base URI of the new node is taken as the value of its xml:base attribute, resolved if it is relative against the base URI of the xsl:copy instruction," but that doesn't appear to alter the expected output.

Obviously we've been over this text a couple of times now, but did the working group really intend for the base URI of a copied element to have this quirky behaviour, where the base URI is copied only if there is no xml:base attribute in the content of the resultant node?

It feels rather odd to me that the base URI of the copied gch element should be determined in such a different way from the base URI of the copied ch element.  Either the working group feels the base URI from the input is more important or the base URI from the instruction in the stylesheet is more important.  Right now we have a mixed view.  I think the specification should either consistently use the base URI of the xsl:copy/xsl:copy-of instruction as the base URI of the new node or consistently use the base URI of the original node, and then resolve any xml:base attribute against that to come up with the ultimate base URI.

[1] http://www.w3.org/TR/xslt20/#shallow-copy
[2] http://www.w3.org/TR/xslt20/#copy-of
Comment 1 Henry Zongaro 2012-06-25 21:00:09 UTC
At its teleconference of 21 June 2012, the XSLT WG decided to make no change in response to this.  I am closing the bug as WONTFIX.