[xslt] Problems with embedded stylesheets, in particular with namespaces



Documents with embedded stylesheets may fail to transform with libxslt
when they reference namespaces from their surrounding scope (attached,
moop_0.xml). That example is a particularly tricky case as the
stylesheet relies on a qname-in-content, but more straightforward
examples involving literal result elements also fail currently.

With a slight modification, making a copy the root element namespace
declaration on its child (attached, moop_1.xml), the transformation
succeeds. However, this demonstrates another issue, as the stylesheet
is removed rather than copied from the source document.

Saxon 6.5.5 produces the same result for both documents (attached,
moop_expected_output.xml). I think libxslt should operate similarly,
rather than keeping its current behaviour (attached,
xsltproc_output.txt).

This is a corner case seems rather underspecified, but see:
<http://www.w3.org/TR/xslt#section-Embedding-Stylesheets>
The example given doesn't address the namespace/qname issue closely,
but does imply that the internal stylesheet should be part of the
input document, rather than being removed from it.

I have suggested a few possible changes (attached,
libxslt_internal_transform.patch) but it needs someone who gets the
implications to pick an option. It seems that the xmlDOMWrap* family
of functions are an (incomplete?) attempt to address this category of
namespace issues, and could potentially solve the whole problem,
whereas the first two suggestions would not fix the inital document
above.

Martin
<!DOCTYPE xmp:moop [<!ATTLIST xsl:transform id ID #IMPLIED>]>
<?xml-stylesheet type="text/xsl" href="#transform"?>
<xmp:moop xmlns:xmp="http://example.com/ns"; xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	<xsl:transform id="transform" version="1.0">
		<xsl:template match="/xmp:moop">
			<xsl:copy-of select="."/>
		</xsl:template>
	</xsl:transform>
</xmp:moop>
<!DOCTYPE xmp:moop [<!ATTLIST xsl:transform id ID #IMPLIED>]>
<?xml-stylesheet type="text/xsl" href="#transform"?>
<xmp:moop xmlns:xmp="http://example.com/ns"; xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	<xsl:transform id="transform" version="1.0" xmlns:xmp="http://example.com/ns";>
		<xsl:template match="/xmp:moop">
			<xsl:copy-of select="."/>
		</xsl:template>
	</xsl:transform>
</xmp:moop>
<?xml version="1.0" encoding="utf-8"?><xmp:moop xmlns:xmp="http://example.com/ns"; xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        <xsl:transform id="transform" version="1.0">
                <xsl:template match="/xmp:moop">
                        <xsl:copy-of select="."/>
                </xsl:template>
        </xsl:transform>
</xmp:moop>
$ xsltproc -V
Using libxml 20632, libxslt 10124 and libexslt 813
xsltproc was compiled against libxml 20632, libxslt 10124 and libexslt 813
libxslt 10124 was compiled against libxml 20632
libexslt 813 was compiled against libxml 20632

$ xsltproc -v /moop_0.xml
xsltLoadStylesheetPI : found PI href=#transform
xsltLoadStylesheetPI : Reference to ID #transform
reusing dictionary from moop_0.xml for stylesheet
creating dictionary for stylesheet
reusing dictionary from (null) for stylesheet
xsltParseStylesheetProcess : found stylesheet
xsltPrecomputeStylesheet: removing ignorable blank node
xsltCompilePattern : parsing '/xmp:moop'
error
xsltCompileStepPattern : no namespace bound to prefix xmp
compilation error: element template
xsltCompilePattern : failed to compile '/xmp:moop'
parsed 1 templates
freeing dictionary from stylesheet
creating dictionary for stylesheet
reusing dictionary from moop_0.xml for stylesheet
xsltPrecomputeStylesheet: removing ignorable blank node
compilation error: file moop_0.xml line 3 element moop
xsltParseStylesheetProcess : document is not a stylesheet
freeing dictionary from stylesheet

$ xsltproc -v /moop_1.xml
xsltLoadStylesheetPI : found PI href=#transform
xsltLoadStylesheetPI : Reference to ID #transform
reusing dictionary from moop_1.xml for stylesheet
creating dictionary for stylesheet
reusing dictionary from (null) for stylesheet
xsltParseStylesheetProcess : found stylesheet
xsltPrecomputeStylesheet: removing ignorable blank node
template has 1 inherited namespaces
xsltCompilePattern : parsing '/xmp:moop'
xsltCompilePattern : parsed /xmp:moop, default priority 0.500000
added pattern : '/xmp:moop' priority 0.500000
parsed 1 templates
Resolving attribute sets references
Creating sub-dictionary from stylesheet for transformation
Registered 0 modules
reusing transformation dict for output
Registering global variables
xsltProcessOneNode: no template found for /
xsltProcessOneNode: applying template '/xmp:moop' for moop
xsltCopyOf: select .
xsltCopyOf: result is a node set
xsltCopyTextString: copy text 
	
xsltCopyTextString: copy text 

freeing transformation dictionary
<?xml version="1.0"?>
<xmp:moop xmlns:xmp="http://example.com/ns"; xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
	
</xmp:moop>
freeing dictionary from stylesheet

Attachment: libxslt_embedded_stylesheet.patch
Description: Binary data



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]