[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

[XSL] xi:include coded in XSL

Subject: [XSL] xi:include coded in XSL
From: Alain <alainb06@xxxxxxx>
Date: Tue, 01 Apr 2008 00:41:42 +0200
 [XSL] xi:include coded in XSL
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.


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.