You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-users@xalan.apache.org by Michael Ludwig <ml...@as-guides.com> on 2009/04/02 11:01:49 UTC

Xalan-J 2.7.1: document() function disregards URI fragment identifier

When passed a URI containing a fragment identifier ("doc#bla"), the
document() function should interpret it according to the document's
ID table, which can be accessed using the id() function.

# more /t2 document-function-fragment-id.xml
<!DOCTYPE Boote [
<!ATTLIST Boot id ID #IMPLIED>
]>
<Boote>
   <Boot id="U3"/>
   <Boot/>
   <Boot id="U5"/>
   <Boot id="U99"/>
</Boote>

# more /t2 document-function-fragment-id.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:variable name="doc"
     select="'document-function-fragment-id.xml'"/>
   <xsl:variable name="id" select="'U5'"/>

   <xsl:template match="/">
     <xsl:copy-of select="document( concat( $doc, '#', $id))"/>
     <!-- Only in 2.0:
     <xsl:copy-of select="document( $doc)/id( $id)"/>
     <xsl:copy-of select="id( $id, document( $doc))"/>
     -->
   </xsl:template>
</xsl:stylesheet>

Saxon (6.5, 9.1) and LibXSLT (1.1.24) produce the following result:

   <Boot id="U5"/>

Xalan 2.7.1 disregards the fragment identifier and copies the entire
document instead of doing a lookup using the document's ID table.

The XSLT 1.0 specification says:

   If the URI reference does contain a fragment identifier, the function
   returns a node-set containing the nodes in the tree identified by the
   fragment identifier of the URI reference. The semantics of the
   fragment identifier is dependent on the media type of the result of
   retrieving the URI. If there is an error in processing the fragment
   identifier, the XSLT processor may signal the error; if it does not
   signal the error, it must recover by returning an empty node-set.
   -- http://www.w3.org/TR/1999/REC-xslt-19991116#document

   <xsl:variable name="id" select="document('lookup.xml#ML1971HH')"/>

This feature of looking up an ID in an external document by specifying
it in the fragment identifier is really convenient. Where it is not
supported, you have to do a context switch using <xsl:for-each> and
create a result tree fragment (RTF) and then possibly use x:node-set(),
which is inconvenient:

   <xsl:variable name="node-with-id"><!-- RTF in XSLT 1.0 -->
     <xsl:for-each select="document('lookup.xml')">
       <xsl:copy-of select="id('ML1971HH')"/>
     </xsl:for-each>
   </xsl:variable>
   <xsl:copy-of select="$node-with-id"/>
   <StrVal><xsl:value-of select="$node-with-id"/></StrVal>
   <!-- Have to use exsl:node-set() to navigate the RTF. -->

This caught my attention here:

Re: [xsl] AltovaXML and fragment identifier - Michael Ludwig
http://markmail.org/message/6ad5trhfztlzior7

Michael Ludwig

Re: Xalan-J 2.7.1: document() function disregards URI fragment identifier

Posted by David Bertoni <db...@apache.org>.
Michael Ludwig wrote:
> Michael Ludwig schrieb:
>> When passed a URI containing a fragment identifier ("doc#bla"), the
>> document() function should interpret it according to the document's
>> ID table, which can be accessed using the id() function.
> 
> [example snipped]
> 
>> Xalan 2.7.1 disregards the fragment identifier and copies the entire
>> document instead of doing a lookup using the document's ID table.
>>
>> The XSLT 1.0 specification says:
>>
>>   If the URI reference does contain a fragment identifier, the
>>   function returns a node-set containing the nodes in the tree
>>   identified by the fragment identifier of the URI reference. The
>>   semantics of the fragment identifier is dependent on the media
>>   type of the result of retrieving the URI. If there is an error in
>>   processing the fragment identifier, the XSLT processor may signal
>>   the error; if it does not signal the error, it must recover by
>>   returning an empty node-set.
>>   -- http://www.w3.org/TR/1999/REC-xslt-19991116#document
> 
> Should I register this as a Xalan-J bug? Or is it just a missing
> feature?
I would classify it as a feature. I should be relatively easy to 
implement.  I added an implementation to Xalan-C in less than a day.

One thing that may be an issue is identifying the media-type.  I made 
the assumption in Xalan-C that all URIs for the document function are 
URLs that refer to XML documents.

Dave


Re: Xalan-J 2.7.1: document() function disregards URI fragment identifier

Posted by Michael Ludwig <ml...@as-guides.com>.
Michael Ludwig schrieb:
> When passed a URI containing a fragment identifier ("doc#bla"), the
> document() function should interpret it according to the document's
> ID table, which can be accessed using the id() function.

[example snipped]

> Xalan 2.7.1 disregards the fragment identifier and copies the entire
> document instead of doing a lookup using the document's ID table.
>
> The XSLT 1.0 specification says:
>
>   If the URI reference does contain a fragment identifier, the
>   function returns a node-set containing the nodes in the tree
>   identified by the fragment identifier of the URI reference. The
>   semantics of the fragment identifier is dependent on the media
>   type of the result of retrieving the URI. If there is an error in
>   processing the fragment identifier, the XSLT processor may signal
>   the error; if it does not signal the error, it must recover by
>   returning an empty node-set.
>   -- http://www.w3.org/TR/1999/REC-xslt-19991116#document

Should I register this as a Xalan-J bug? Or is it just a missing
feature?

There is only one match for "fragment identifier" in Xalan-J.

https://issues.apache.org/jira/browse/XALANJ

Michael Ludwig