Xinclude fragments
Posted: Sat Jul 01, 2006 3:46 pm
I'm encountering problems "including" fragments of XSLT into XSLT using general entities of DTD with Xalan. Depending on the XSLT that a general entity resolves to, I get a NullPointerException, even though the same thing works when I use another XSLT engine. I hear -- but can find no confirmation on the Web -- that this has to do with Xalan precompiling XSLT. I've been able to narrow the problem XSLT down to fragments that contain xs:choose.
Question 1: Does anyone have more specific information on this problem and, if so, is there a solution or workaround?
In order to circumvent the problem, I'm trying to use Xinclude. My first attempt was to simple cut the contents of a general entity out, place it in a separate file, and replace it in the entity definition by an xi:include point to the file. Unfortunately, it seems that the document must be well formed, i.e., must have a root element. So I placed a root element xsl:stylesheet into the included xml and tried to use xpointer in xi:incloude to indicate that I only want the "guts", not the root element, e.g., xpointer="range-inside(element(/1))". It seems, unfortunately, that either XInclude or the parser being used by the XSLT engine (I've tried Saxon 6.5.5 and Xalan) don't allow range-inside.
Question 2: How can I use only a fragment of the XML document?
Here's what I have:
The XML document that needs the fragment:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY % wbml_xslt SYSTEM "wbml_xslt.ent">
%wbml_xslt;
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wbr="http://www.ubs.com/namespaces/wbml-render" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml">
<xsl:import href="wb2xhtml_0.0.xslt"/>
<xsl:import href="local/wbml_xslt_global.xslt"/>
&enter-stylesheet;
<xsl:variable name="_xsltversion">XSLT for Accessibility/wb2xhtml_0.0_local.xslt</xsl:variable>
<xsl:variable name="_markoftheweb">http://www.ubs.com/</xsl:variable>
</xsl:stylesheet>
In wbml_xslt:ent:
<!ENTITY enter-stylesheet "
<xi:include href='enter_stylesheet.xml' xpointer='range-inside(element(/1))' xmlns:xi='http://www.w3.org/2001/XInclude'/>
">
The XIncluded document enter_stylesheet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:param name="_dfltLang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
<xsl:param name="_server" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltServer"/>
</xsl:param>
<xsl:param name="_imageservlet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltImageservlet"/>
</xsl:param>
<xsl:param name="_mediaservlet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltMediaservlet"/>
</xsl:param>
<xsl:param name="_chartservlet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltChartservlet"/>
</xsl:param>
<xsl:param name="_formserver" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltFormserver"/>
</xsl:param>
<xsl:param name="_formapplication" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltFormapplication"/>
</xsl:param>
<xsl:param name="_path" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltPath"/>
</xsl:param>
<xsl:param name="_siteRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@siteRef | wbr:renderingArticle/@siteRef | wbr:homepage/@siteRef"
/>
</xsl:param>
<xsl:param name="_nodeRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@nodeRef | wbr:renderingArticle/@nodeRef | wbr:homepage/@nodeRef"
/>
</xsl:param>
<xsl:param name="_pageId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@pageId | wbr:renderingArticle/@pageRef | wbr:homepage/@pageId"
/>
</xsl:param>
<xsl:param name="_variantId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@variantId | wbr:renderingArticle/@variantId | wbr:homepage/@variantId"
/>
</xsl:param>
<xsl:param name="_color" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@color | wbr:renderingArticle/@color | wbr:homepage/@color"/>
</xsl:param>
<xsl:param name="_textcolor" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@textcolor | wbr:renderingArticle/@textcolor | wbr:homepage/@textcolor"
/>
</xsl:param>
<xsl:param name="_transparency" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@transparency | wbr:renderingArticle/@transparency | wbr:homepage/@transparency"
/>
</xsl:param>
<xsl:param name="_navLang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@navLang | wbr:renderingArticle/@navLang | wbr:homepage/@navLang"
/>
</xsl:param>
<xsl:param name="_articleId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of select="wbr:renderingArticle/@articleId"/>
</xsl:param>
<xsl:param name="_channelRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of select="wbr:renderingArticle/@channelRef"/>
</xsl:param>
<xsl:param name="_accessibilityParms" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltAccessibilityParms"/>
</xsl:param>
<xsl:variable name="_accessibilityVisibleStructure"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of select="contains($_accessibilityParms, 'visible-structure')"/>
</xsl:variable>
<xsl:variable name="_accessibilityImagesInProse"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of select="contains($_accessibilityParms, 'images-in-prose')"/>
</xsl:variable>
<xsl:variable name="_doclang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:choose>
<xsl:when test="$_dfltLang != ''">
<xsl:value-of select="$_dfltLang"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="/child::*[1]/@xml:lang"
xmlns:xml="http://www.w3.org/XML/1998/namespace"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="/">
<xsl:param name="dfltLang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltLang"/>
</xsl:param>
<xsl:param name="siteRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_siteRef"/>
</xsl:param>
<xsl:param name="nodeRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_nodeRef"/>
</xsl:param>
<xsl:param name="pageId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_pageId"/>
</xsl:param>
<xsl:param name="variantId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_variantId"/>
</xsl:param>
<xsl:param name="color" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_color"/>
</xsl:param>
<xsl:param name="textcolor" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_textcolor"/>
</xsl:param>
<xsl:param name="transparency" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_transparency"/>
</xsl:param>
<xsl:param name="navLang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_navLang"/>
</xsl:param>
<xsl:param name="articleId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_articleId"/>
</xsl:param>
<xsl:param name="channelRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_channelRef"/>
</xsl:param>
<xsl:variable name="lang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
<xsl:choose>
<xsl:when test='@xml:lang'><xsl:value-of select='@xml:lang'/></xsl:when>
<xsl:otherwise><xsl:value-of select='$dfltLang'/></xsl:otherwise>
</xsl:choose>
-->
<xsl:variable name="_l" select="ancestor-or-self::*[@xml:lang][1]/@xml:lang"/>
<xsl:choose>
<xsl:when test="$_l">
<xsl:value-of select="$_l"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$dfltLang"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable> &apply-templates; </xsl:template>
</xsl:stylesheet>
Any solution should work with Saxon and Xalan.
Thanks,
Richard
Question 1: Does anyone have more specific information on this problem and, if so, is there a solution or workaround?
In order to circumvent the problem, I'm trying to use Xinclude. My first attempt was to simple cut the contents of a general entity out, place it in a separate file, and replace it in the entity definition by an xi:include point to the file. Unfortunately, it seems that the document must be well formed, i.e., must have a root element. So I placed a root element xsl:stylesheet into the included xml and tried to use xpointer in xi:incloude to indicate that I only want the "guts", not the root element, e.g., xpointer="range-inside(element(/1))". It seems, unfortunately, that either XInclude or the parser being used by the XSLT engine (I've tried Saxon 6.5.5 and Xalan) don't allow range-inside.
Question 2: How can I use only a fragment of the XML document?
Here's what I have:
The XML document that needs the fragment:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY % wbml_xslt SYSTEM "wbml_xslt.ent">
%wbml_xslt;
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wbr="http://www.ubs.com/namespaces/wbml-render" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/1999/xhtml">
<xsl:import href="wb2xhtml_0.0.xslt"/>
<xsl:import href="local/wbml_xslt_global.xslt"/>
&enter-stylesheet;
<xsl:variable name="_xsltversion">XSLT for Accessibility/wb2xhtml_0.0_local.xslt</xsl:variable>
<xsl:variable name="_markoftheweb">http://www.ubs.com/</xsl:variable>
</xsl:stylesheet>
In wbml_xslt:ent:
<!ENTITY enter-stylesheet "
<xi:include href='enter_stylesheet.xml' xpointer='range-inside(element(/1))' xmlns:xi='http://www.w3.org/2001/XInclude'/>
">
The XIncluded document enter_stylesheet.xml:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:param name="_dfltLang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
<xsl:param name="_server" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltServer"/>
</xsl:param>
<xsl:param name="_imageservlet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltImageservlet"/>
</xsl:param>
<xsl:param name="_mediaservlet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltMediaservlet"/>
</xsl:param>
<xsl:param name="_chartservlet" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltChartservlet"/>
</xsl:param>
<xsl:param name="_formserver" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltFormserver"/>
</xsl:param>
<xsl:param name="_formapplication" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltFormapplication"/>
</xsl:param>
<xsl:param name="_path" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltPath"/>
</xsl:param>
<xsl:param name="_siteRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@siteRef | wbr:renderingArticle/@siteRef | wbr:homepage/@siteRef"
/>
</xsl:param>
<xsl:param name="_nodeRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@nodeRef | wbr:renderingArticle/@nodeRef | wbr:homepage/@nodeRef"
/>
</xsl:param>
<xsl:param name="_pageId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@pageId | wbr:renderingArticle/@pageRef | wbr:homepage/@pageId"
/>
</xsl:param>
<xsl:param name="_variantId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@variantId | wbr:renderingArticle/@variantId | wbr:homepage/@variantId"
/>
</xsl:param>
<xsl:param name="_color" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@color | wbr:renderingArticle/@color | wbr:homepage/@color"/>
</xsl:param>
<xsl:param name="_textcolor" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@textcolor | wbr:renderingArticle/@textcolor | wbr:homepage/@textcolor"
/>
</xsl:param>
<xsl:param name="_transparency" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@transparency | wbr:renderingArticle/@transparency | wbr:homepage/@transparency"
/>
</xsl:param>
<xsl:param name="_navLang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of
select="wbr:renderingPage/@navLang | wbr:renderingArticle/@navLang | wbr:homepage/@navLang"
/>
</xsl:param>
<xsl:param name="_articleId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of select="wbr:renderingArticle/@articleId"/>
</xsl:param>
<xsl:param name="_channelRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of select="wbr:renderingArticle/@channelRef"/>
</xsl:param>
<xsl:param name="_accessibilityParms" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltAccessibilityParms"/>
</xsl:param>
<xsl:variable name="_accessibilityVisibleStructure"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of select="contains($_accessibilityParms, 'visible-structure')"/>
</xsl:variable>
<xsl:variable name="_accessibilityImagesInProse"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:value-of select="contains($_accessibilityParms, 'images-in-prose')"/>
</xsl:variable>
<xsl:variable name="_doclang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wbr="http://www.ubs.com/namespaces/wbml-render">
<xsl:choose>
<xsl:when test="$_dfltLang != ''">
<xsl:value-of select="$_dfltLang"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="/child::*[1]/@xml:lang"
xmlns:xml="http://www.w3.org/XML/1998/namespace"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform" match="/">
<xsl:param name="dfltLang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_dfltLang"/>
</xsl:param>
<xsl:param name="siteRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_siteRef"/>
</xsl:param>
<xsl:param name="nodeRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_nodeRef"/>
</xsl:param>
<xsl:param name="pageId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_pageId"/>
</xsl:param>
<xsl:param name="variantId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_variantId"/>
</xsl:param>
<xsl:param name="color" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_color"/>
</xsl:param>
<xsl:param name="textcolor" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_textcolor"/>
</xsl:param>
<xsl:param name="transparency" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_transparency"/>
</xsl:param>
<xsl:param name="navLang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_navLang"/>
</xsl:param>
<xsl:param name="articleId" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_articleId"/>
</xsl:param>
<xsl:param name="channelRef" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:value-of select="$_channelRef"/>
</xsl:param>
<xsl:variable name="lang" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!--
<xsl:choose>
<xsl:when test='@xml:lang'><xsl:value-of select='@xml:lang'/></xsl:when>
<xsl:otherwise><xsl:value-of select='$dfltLang'/></xsl:otherwise>
</xsl:choose>
-->
<xsl:variable name="_l" select="ancestor-or-self::*[@xml:lang][1]/@xml:lang"/>
<xsl:choose>
<xsl:when test="$_l">
<xsl:value-of select="$_l"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$dfltLang"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable> &apply-templates; </xsl:template>
</xsl:stylesheet>
Any solution should work with Saxon and Xalan.
Thanks,
Richard