xsl-list
[Top] [All Lists]

[xsl] [XSL] xi:include coded in XSL

2008-03-31 15:42:13
Hello list,

as I tried running my XSL transformations with my fresh new Ubuntu 7.10 install, I got the error :

Error
Selected XML parser gnu.xml.stream.SAXParser does not support XInclude processing

Failed to compile stylesheet. 1 error detected.

The error message is quite clear, and I can't blame Saxon (which I'm using) for that. So I had the idea to remove the -xi option for XInclude processing, and do it in XSL instead, of course without modifying the XML files, where xi:include would still remain coded. Sticking to the norm is easier for maintenance I think.

So what I did basically is add a few templates to my existing code :

<xsl:template match="/" mode="XInclude">
 <xsl:variable name="pass1">
   <xsl:apply-templates select="/" mode="XInclude">
     <xsl:with-param name="XML-uri" select="document-uri(/)" tunnel="yes"/>
   </xsl:apply-templates>
 </xsl:variable>

 <xsl:apply-templates select="$pass1"/>
</xsl:template>


<!-- *******************

     xi:include rewritten in XSL

     ********************-->
<!-- This is identity transformation for nodes not in the xi: namespace -->

<xsl:template match="@* | node()" mode="XInclude">
   <xsl:copy>
       <xsl:apply-templates select="@* | node()" mode="XInclude"/>
   </xsl:copy>
</xsl:template>


<!-- Template for @parse='xml' of no @parse, xml being the default parsing mode --> <!-- Note we have to pass the document-uri, otherwise if the URI in @href is relative, it would resolve against base-uri which is the path for xsl stylesheet, potentially different from the path where the xml document is -->

<xsl:template match="xi:include[not(exists(@parse)) or lower-case(@parse)='xml']" mode="XInclude">
 <xsl:param name="XML-uri" tunnel="yes"/>

<xsl:apply-templates select="document(resolve-uri(@href,$XML-uri))" mode="XInclude"> <xsl:with-param name="XML-uri" select="document(resolve-uri(@href,$XML-uri))" tunnel="yes"/>
 </xsl:apply-templates>
</xsl:template>



So it works, giving saxon an initial mode with im:XInclude... but my questions are:

Apart from the ERR XTDE1480 which could occur adding the above templates, this method looks safe to me. /Don't complain about XTDE1480. I already did and Michael admitted in a other post that it *IS* a side-effect in XSL which is supposed not to bring side-effects, but explained the reason of this trade-off choice... and it is perfectly understandable, although for what I have to code, and the above templates are yet another example, I regret the choice made by the WG!/


Question 1: am I missing some other things, and would I bump into future problems for maintenance, with this substitute of the ill supported xi:include?


Question 2: did someone already wrote "xi:include in XSL" (or part of it)? I would rather xsl:import existing templates if enough debugged... and if it was made open source! /Feel free to copy my templates if needed, but be warned they are not so well tested, and do a very small part of XInclude!/


Because of course, I coded only what I needed.
We could
- add a template to handle parse='text' with its @encoding attribute
- add a test if document is unavailable to render the xi:fallback
- add a template/test to complain about Xpointer being a nightmare to do in XSL and so not supported! (it would mean at least "dynamic XPATH" through some kind of 'eval' extension to do... and a lot of aspirin because it looks even more complicated than Xpath) - try to test infinite recursion (xi:include including itself directly or not)... not so obvious... or do nothing and let the Java heap explode if infinite recursion done. - file a request at W3C - XSLT WG so that we can have the 'accept' headers arguments when relevant on document() and unparsed-text() for XSLT3.0 and so be able to render the xi:include @accept and @accept-language (although we can "filter" language on the machine running XSL, it could be a good think to be able to do so on the "server" for bandwith sake... don't forget there are already huge XML/XSL sites -more than 0,5MB of XSL files on my Firefox cache-, such as https://www.wow-europe.com/fr/index.xml where XSL runs on your PC's browser)
- etc...


Or maybe you would have a sounder advise such as: "why not install Xerces on your Ubuntu and make it work with Saxon?" (answer is, I'm being lazy finding and reading the documentation for that difficult task ;-) )


Best regards.


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>