- From: Andre Cusson <ac@hyperbase.com>
- Date: Mon, 09 Feb 2004 09:01:50 -0500
- To: public-qt-comments@w3.org
Hi,
In XSLT1.1, attributes like method and indent could easily be parametrized
or calculated.for the xsl:document instruction, allowing one, for example,
to render some documents in HTML, others in XML, some with indentation,
some not.
With XSLT2.0, there seems to be no way to parametrize the output format of
a document :
One can define multiple corresponding xsl:output instructions, each with a
different specific combination of output format attributes; then one can
define an xsl:result-document instruction and assign the corresponding
xsl:output format name to the xsl:result-document format attribute, but the
format attribute is a litteral QName and cannot be assigned, calculated, or
parametrized, even with cast to xs:QName. The only remaining alternative
is to duplicate the xsl:result-document instruction block (and an
xsl:output instruction) for every possible xsl:output attribute value
combination and to xsl:choose between them, based on the specific values
and their combination.
I find this inelegant, clumsy, redundant and difficult to maintain.
Why can't result-document have its own output attributes ?
If not, why can't the xsl:result-document format attribute be assigned a
value other than a litteral QName ?
Serializing output documents is a fundamental operation in XSLT and it
should be parametrizable.
Why separate the output format attribute from the only instruction that
uses them ?
Why force a litteral QName to join them later ?
Thank you.
Andre
Here is some sample code of what it may look like in XSLT2.0 if you could
assign to the format attribute. Now, this does not work.
<xsl:output name="xmlyes" method="xml" version="1.0"
encoding="ISO-8859-1" omit-xml-declaration="no" indent="yes"
media-type="text/html"/>
<xsl:output name="xmlno" method="xml" version="1.0"
encoding="ISO-8859-1" omit-xml-declaration="no" indent="no"
media-type="text/html"/>
<xsl:output name="htmlyes" method="html" version="1.0"
encoding="ISO-8859-1" omit-xml-declaration="no" indent="yes"
media-type="text/html"/>
<xsl:output name="htmlno" method="html" version="1.0"
encoding="ISO-8859-1" omit-xml-declaration="no" indent="no"
media-type="text/html"/>
...
<xsl:template name="persist-file">
...
<xsl:result-document href="filename"
format="{xs:QName(concat(@method, @indent))}">
<xsl:apply-templates mode="buildpage" select="."/>
</xsl:result-document>
or even
<xsl:result-document href="filename">
<xsl:attribute name="format"><xsl:value-of
select="xs:QName(concat(@method, @indent))"/></xsl:attribute>
<xsl:apply-templates mode="buildpage" select="."/>
</xsl:result-document>
...
</xsl:template>
Here is a sample of what works today, if we only have four attribute value
combinations :
<xsl:output name="xmlyes" method="xml" version="1.0"
encoding="ISO-8859-1" omit-xml-declaration="no" indent="yes"
media-type="text/html"/>
<xsl:output name="xmlno" method="xml" version="1.0"
encoding="ISO-8859-1" omit-xml-declaration="no" indent="no"
media-type="text/html"/>
<xsl:output name="htmlyes" method="html" version="1.0"
encoding="ISO-8859-1" omit-xml-declaration="no" indent="yes"
media-type="text/html"/>
<xsl:output name="htmlno" method="html" version="1.0"
encoding="ISO-8859-1" omit-xml-declaration="no" indent="no"
media-type="text/html"/>
...
<xsl:template name="persist-file">
...
<xsl:choose>
<xsl:when test="@indent = 'yes' ">
<xsl:choose>
<xsl:when test="@method = 'xml' ">
<xsl:result-document href="filename" format="xmlyes">
<xsl:apply-templates mode="buildpage" select="."/>
</xsl:result-document>
</xsl:when>
<xsl:when test="@method = 'html' ">
<xsl:result-document href="filename" format="htmlyes">
<xsl:apply-templates mode="buildpage" select="."/>
</xsl:result-document>
</xsl:when>
</xsl:choose>
<xsl:when>
<xsl:when test="@indent = 'no' ">
<xsl:choose>
<xsl:when test="@method = 'xml' ">
<xsl:result-document href="filename" format="xmlno">
<xsl:apply-templates mode="buildpage" select="."/>
</xsl:result-document>
</xsl:when>
<xsl:when test="@method = 'html' ">
<xsl:result-document href="filename" format="xmlno">
<xsl:apply-templates mode="buildpage" select="."/>
</xsl:result-document>
</xsl:when>
</xsl:choose>
<xsl:when>
</xsl:choose>
...
</xsl:template>
Finally, in XSLT1.1, this is all that is required (whatever the number of
attribute value combinations) isn't this much nicer ?
<xsl:template name="persist-file">
...
<xsl:document href="filename" method="@method" indent="@indent"
version="@version" media-type="@media-type" encoding="@encoding"
omit-xml-declaration="@omit-xml-declaration">
<xsl:apply-templates mode="buildpage" select="."/>
</xsl:result-document>
...
</xsl:template>
What happens, in XSLT2.0, if we need to support more methods and if we also
need to vary the version number, the encoding, the omit-xml-declaration,
and the media-type ?
Received on Monday, 9 February 2004 09:07:35 UTC