Hi Simon,

     Sorry for the long delay in following up on this.  I agree that the 
fact that Xalan-J is trying to assume responsibility for the meaning of 
the fragment is probably a bug.  I think you should open a bug in Bugzilla 
for this.

     I was just wondering whether plugging in a class that implements the 
javax.xml.transform.URIResolver interface and returns a SAXSource object 
might be a way of working around the problem.

Thanks,

Henry
------------------------------------------------------------------
Henry Zongaro      Xalan development
IBM SWS Toronto Lab   Tie Line 969-6044;  Phone (905) 413-6044
mailto:[EMAIL PROTECTED]




Simon Del Fabbro <[EMAIL PROTECTED]>
Sent by: [EMAIL PROTECTED]
02/06/2003 11:47 AM
Please respond to xalan-dev

 
        To:     [EMAIL PROTECTED]
        cc: 
        Subject:        Re: Xalan Java2: XPath fragment with href in include element

 

Hello Henry,

Thanks for the reply.

Yes, I am trying to index an element which is child to "some-tag" using
the
notation in accordance to http://www.w3.org/TR/xptr-xpointer/. My
collegue
who implemented the URL handler misinterpreted the specification or it
got
confused(!) with [1] and [2]. You are correct in that the URI should
look
something like:

cqr:////<some name to the content which contains the
XSL>#xpointer(some-tag/* %5B 
namespace-uri()='http://www.w3.org/1999/XSL/Transform' and
local-name()='stylesheet' %5D)"

Our protocol handler takes (should take) this URI and handle the XPath
stuff
and return the correct element as required by the XPath. So if we had
the document

<some-tag>
    <xsl:stylesheet>
      ...
    </xsl:stylesheet>
</some-tag>

then the above URI should result in a stream containing

<xsl:stylesheet>
....
</xsl:stylesheet>

Although the current version of Xalan-J doesn't support this type of
addressing,
the check for the hash in the method pushBaseIndentifier in
org.apache.xalan.processor.StyleSheetHandler stops any further
processing
with *any* URI which contains a hash. For example, consider the
following stylesheets:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:include href="file:///tmp/library.xsl#here"/>

    <xsl:template match="/">
           <message><xsl:call-template name="sayHelloWorld"/></message>
    </xsl:template>

</xsl:stylesheet>

where /tmp/library.xsl is

<doc xmlns:xsl="http://www.w3.org/1999/XSL/Transform";><xsl:stylesheet
id="here" version="1.0">
    <xsl:template name="sayHelloWorld">Hello World</xsl:template>
</xsl:stylesheet>
</doc>

Nothing is produced and also when /tmp/library.xsl is

<xsl:stylesheet id="here" version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
    <xsl:template name="sayHelloWorld">Hello World</xsl:template>
</xsl:stylesheet>

It should produce:

<?xml version="1.0" encoding="UTF-8"?>
<message>Hello World</message>

Is this correct?

I am using Xalan Java 2.4.1

Regards,

Simon.

>      If I understand that code correctly, the URI fragment is being 
handled
> in accordance with the interpretation of the XPointer Framework Proposed
> Recommendation - sections 3 [1] and 3.2 [2] of that document - or with 
some
> predecessor version of that document.  Paraphrasing XPointer, the 
fragment
> would be interpreted as referring to the first element in document order
> with an attribute or child whose schema-type is type ID or with an
> attribute whose DTD type is ID, where the normalized value or schema
> normalized value of said attribute or child is the same as the fragment
> identifier.
> 
>      To use a more concrete example, the URI <file:///abc.xsl#HERE> 
would
> refer to the xsl:stylesheet fragment in the following document named
> abc.xsl:
> 
> <!DOCTYPE doc [
> <!ELEMENT doc ANY>
> <!ATTLIST doc xmlns:xsl CDATA #IMPLIED
>               xmlns:blah CDATA #IMPLIED>
> <!ELEMENT xsl:stylesheet ANY>
> <!ATTLIST xsl:stylesheet id ID #IMPLIED
>                          version CDATA #IMPLIED>
> ]>
> <doc xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>   <xsl:stylesheet id="HERE" version="1.0">
>      ...
>   </xsl:stylesheet>
> </doc>
> 
>      In order to index a set of nodes that are "beneath" a some-tag
> element, the way you are trying to, I think you'd have to use the 
"XPointer
> scheme" [3] in the XPointer Framework in something like the following
> fashion.  (I'm not clear on the semantics, so this might just select the
> element and not its children.)
> 
> <xsl:include href="cqr:////<some name to the content which contains the
> XSL>#xpointer(some-tag/* %5B
> namespace-uri()='http://www.w3.org/1999/XSL/Transform' and
> local-name()='stylesheet' %5D)"/>
> 
> However, Xalan-J Interpretive appears only to support the limited case 
I've
> described above, in which an ID value appears after the number sign.  I
> think it would probably be a good thing for Xalan-J to support the more
> general forms of addressing described by those proposed recommendations 
-
> perhaps via support in an XML parser, like Xerces-J.
> 
>      I'm not sure I understand the examples you describe under 
"Additional
> points to consider".  Could I ask you to provide real examples to
> illustrate the points?
> 
> Thanks,
> 
> Henry
> [1] http://www.w3.org/TR/xptr-framework/#language
> [2] http://www.w3.org/TR/xptr-framework/#shorthand
> [3] http://www.w3.org/TR/xptr-xpointer/
> ------------------------------------------------------------------
> Henry Zongaro      Xalan development
> IBM SWS Toronto Lab   Tie Line 969-6044;  Phone (905) 413-6044
> mailto:[EMAIL PROTECTED]
> 
> 
>                       Simon Del Fabbro
>                       <simon.delfab@cqr        To: 
[EMAIL PROTECTED]
>                       data.com>                cc:
>                       Sent by:                 Subject:  Re:  Xalan 
Java2: XPath fragment with href in include element
>                       simon.delfab@cqrd
>                       ata.com
> 
> 
>                       02/05/2003 11:46
>                       AM
>                       Please respond to
>                       xalan-dev
> 
> 
> 
> Hi,
> 
> I have encountered a problem when trying to include a stylesheet which
> has an XPath fragment in a URI.
> 
> I am working on a document management system and we have our own
> namespace,
> URL and URL handler. A stylesheet is wrapped up in some element as
> follows
> 
> <some-tag>
>    <xsl:stylesheet>
>      ...
>    </xsl:stylesheet>
> </some-tag>
> 
> To import the stylesheet I would write:
> 
> <xsl:include href="cqr:////<some name to the content which contains the
> XSL>#some-tag/* %5B
> namespace-uri()='http://www.w3.org/1999/XSL/Transform' and
> local-name()='stylesheet' %5D"/>
> 
> where %5B and %5D are [ and ] respectively.
> 
> This doesn't work. The templates defined in the imported template aren't
> imported. Looking
> at the Xalan code I noticed that the following method defined
> org.apache.xalan.processor.StyleSheetHandler
> sets the variable m_shouldProcess to false because my base identifier
> has a # in it and therefore
> the stylesheet doesn't get imported.
> 
> void pushBaseIndentifier(String baseID)
>   {
>     if (null != baseID)
>     {
>       int posOfHash = baseID.indexOf('#');
> 
>       if (posOfHash > -1)
>       {
>         m_fragmentIDString = baseID.substring(posOfHash + 1);
>         m_shouldProcess = false;
>       }
>       else {
>         m_shouldProcess = true;
>       }
>     }
>     else
>       m_shouldProcess = true;
> 
>     m_baseIdentifiers.push(baseID);
>   }
> 
> So here's my question: what is this method doing? i.e. what sort of base
> identifiers is this check
> looking for?
> 
> Also, pushBaseIndentifier is misspelt.
> 
> Additional points to consider:
> URL handler with XPath works OK. Grabs the right blob of XML elements
> i.e. a stream containing an XML document which is
> a stylesheet.
> Here's weird one. The included stylesheet contained a template which the
> importing stylesheet called. This template wasn't
> obviously being called (trace writes verified this), but no error was
> raised. That is, no-template-with-name-was-found type
> error was raised. Removing this include statement or placing it at the
> end of the stylesheet and it complained that it couldn't
> find the template.
> 
> S.



Reply via email to