- From: Henry Zongaro <zongaro@ca.ibm.com>
- Date: Tue, 8 Jun 2004 23:39:36 -0400
- To: Martin Duerst <duerst@w3.org>
- Cc: "Michael Kay" <mhk@mhk.me.uk>, public-qt-comments@w3.org, w3c-i18n-ig@w3.org
Hi, Martin.
In [1], you wrote:
Martin Duerst wrote on 2004-05-24 05:31:53 AM:
> At 17:52 04/05/06 +0100, Michael Kay wrote:
> >The places where XSLT/XQuery use space as a default separator are all
> >associated with converting a typed value to the string value of a node,
and
> >are therefore closely associated with this XML Schema convention for
> >representing lists. Of course we can't totally control how the facility
is
> >used, but we do provide a string-join function that allows any
separator to
> >be used in the lexical representation of a sequence, so we are not
imposing
> >any constraints on users.
>
> Would it be possible for you to write the following three examples:
>
> - An example (such as above with "red", "green", "blue", but with the
> actual code) where these are e.g. NMTOKENS, and where the
serialization
> with spaces makes sense.
Assume the following input document, where the type of the colors
attribute is xs:NMTOKENS.
<elem colors="red green blue"/>
and the following stylesheet:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="/">
<xsl:sequence select="data(elem/@colors)"/>
</xsl:template>
</xsl:stylesheet>
The result of serialization will be the following external general parsed
entity.
<?xml version="1.0" encoding="UTF-8"?>red green blue
That entity might be subsequently referenced in the content of an element
that has the simple type xs:NMTOKENS. If the PSVI that results is used to
construct an instance of the XPath/XQuery Data Model, the typed valued of
the element would be a sequence of three values of type xs:NMTOKEN;
without the spaces, the typed value would be a sequence of a single value
of type xs:NMTOKEN: "redgreenblue".
Compare that with the result of the following stylesheet, where the rules
for evaluating an attribute value template (section 5.5 of the last call
draft of XSLT 2.0) state that each atomized value in the sequence that
results from evaluating each XPath expression will be converted to a
string, and separated by a space:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="/">
<elem colors="{data(elem/@colors)}"/>
</xsl:template>
</xsl:stylesheet>
Result:
<?xml version="1.0" encoding="UTF-8"?><elem colors="red green blue"/>
Again, if that serialized entity is assessed against a schema in which the
colors attribute has type xs:NMTOKENS, the typed value of the attribute
will be a sequence of three values of type xs:NMTOKEN.
Similarly, the result of the following stylesheet, where the rules for
constructing complex content (section 5.6.1 of XSLT 2.0) describe how a
text node is created from the sequence of atomic values that results from
evaluating the xsl:sequence instruction:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<xsl:template match="/">
<elem><xsl:sequence select="data(elem/@colors)"/></elem>
</xsl:template>
</xsl:stylesheet>
Result:
<elem>red green blue</elem>
> - An example with e.g. strings used as intermediate text in a formating-
> like operation (a la printf in C), where inserting spaces would
happen,
> but would not be desired.
Is this the kind of example you're looking for? I've used an XPath
expression to perform a simple date formatting operation, constructing the
result as a sequence of strings.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:hz="http://www.example.org"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0"
exclude-result-prefixes="hz xs">
<xsl:function name="hz:format">
<xsl:param name="date" as="xs:date"/>
<xsl:param name="format" as="xs:string"/>
<xsl:sequence
select="
for $c in
(for $i in (1 to string-length($format))
return substring($format, $i, 1))
return
if ($c = 'y') then
get-year-from-date($date)
else if ($c = 'd') then
get-day-from-date($date)
else if ($c = 'm') then
get-month-from-date($date)
else if ($c = 'M') then
('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')
[get-month-from-date($date)]
else
$c"/>
</xsl:function>
<xsl:template match="/">
<doc>
<v1>
<xsl:sequence
select="hz:format(xs:date('2004-12-21'), 'y-m-d')"/>
</v1>
<v2>
<xsl:sequence
select="hz:format(xs:date('2004-12-31'), 'M d, y')"/>
</v2>
</doc>
</xsl:template>
</xsl:stylesheet>
This stylesheet will produce the following result, which is probably not
what was intended.
<doc><v1>2004 - 12 - 21</v1><v2>Dec 31 , 2004</v2></doc>
> - The previous example with the above 'string-join' function used to
> avoid the problems with spaces.
If I change the definition of hz:format to add in a reference to
string-join, specifying '' as the separator,
<xsl:function name="hz:format-date">
<xsl:param name="date" as="xs:date"/>
<xsl:param name="format" as="xs:string"/>
<xsl:sequence
select="string-join(
for $c in
(for $i in (1 to string-length($format))
return substring($format, $i, 1))
return
...
, '')"/>
</xsl:function>
the result will be:
<doc><v1>2004-12-21</v1><v2>Dec 31, 2004</v2></doc>
Thanks,
Henry
[1]
http://lists.w3.org/Archives/Public/public-qt-comments/2004May/0053.html
------------------------------------------------------------------
Henry Zongaro Xalan development
IBM SWS Toronto Lab T/L 969-6044; Phone +1 905 413-6044
mailto:zongaro@ca.ibm.com
Received on Tuesday, 8 June 2004 23:40:09 UTC