Re: collections, file names, and document order

Michael Kay <mike-JkSD5nQpfvpWk0Htik3J/[email protected]> Mon, 20 Dec 2021 15:22:41 +0000
Newsgroups gmane.text.xml.saxon.help
Message-ID <[email protected]>
--===============6014015109945595841==
Content-Type: multipart/alternative;
	boundary="Apple-Mail=_0353210E-3D86-418C-A967-577ABCFAF5B3"


--Apple-Mail=_0353210E-3D86-418C-A967-577ABCFAF5B3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8

Firstly, suppose you do

<xsl:apply-templates select=3D"doc('abc.xml') | doc('def.xml')"/>

If neither of these documents has been seen before, Saxon will read them =
in the order specified, will allocate them internal sequential document =
numbers, and the document numbers will determine document order, so =
after the union operation (which sorts into document order), abc.xml =
will come first.

But suppose def.xml has already been seen earlier? In that case its =
document number will be lower than that of abc.xml, and it will =
therefore sort before abc.xml , which means in the result of the union =
operation, def.xml will come first.

The same is true if the two documents are members of a collection and =
you read the collection. Except that it's complicated in Saxon-EE =
because collections are processed in parallel, which means that the =
order the documents are read may vary from one run to the next.

There's an open bug here, https://saxonica.plan.io/issues/5067, which =
concerns the repeatability of the order of items in a collection, and =
which might well be relevant here. Generally it's a bad idea to read the =
same collection twice. It's inefficient, for starters, and it also gives =
you problems with collection stability (what happens if things change on =
disk?).

>=20
> I would like to process a subset of files in a set of directories. =
Seems like a job for the collection() function. But the process I am =
thinking of (as most of my processes) needs to know the input file=E2=80=99=
s path. Well, the uri-collection() function seems like the ticket, eh?

Yes. You could also use collection() and then apply document-uri() to =
the returned documents, but if you want to filter based on the URI, then =
uri-collection() will be more efficient.
>=20
> But I note the documentation =
<https://www.saxonica.com/html/documentation10/sourcedocs/collections/> =
says that the nodes returned by collection() (and I presume =
uri-collection(), too?) are not necessarily in document order. First =
off, I do not entirely grok what =E2=80=9Cdocument order=E2=80=9D means =
with respect to a collection of files. (Perhaps =E2=80=9Cthe order your =
OS returns them in=E2=80=9D or =E2=80=9Cthe same order as you got last =
time=E2=80=9D or =E2=80=9Calphabetic order=E2=80=9D?) But it doesn=E2=80=99=
t really matter to me what order the files are presented in, but to use =
uri-collection() to get the names and collection() to get the =
corresponding file=E2=80=99s contents, it matters that the two functions =
return the file(name)s in the same order, whatever it is.

I would use uri-collection() to get the URIs and then use doc() to =
retrieve the URIs you are interested in.
>=20
> The attached (useless) program demonstrates what I am trying to do. In =
this case, process all of the files in my ~/Documents/whatever/one/, =
~/Documents/whatever/two/, and ~/Documents/whatever/three/ directories =
that start with the letter =E2=80=98r=E2=80=99, have a dot in the =
middle, and end with the extension =E2=80=9C.odd=E2=80=9D, =E2=80=9C.tei=E2=
=80=9D, or =E2=80=9C.xml=E2=80=9D. Note to TEI folks =E2=80=94 for the =
purposes of this discussion every document has an outermost element of =
<TEI>, and each header has one and only one <idno> in the =
<publicationStmt>. Yes, TEI allows variations, but this is about =
collection(), not how to find stuff in a TEI document. =F0=9F=99=82
>=20
> Questions, in rough order of importance (in some sense of =
=E2=80=9Cimportance=E2=80=9D :-) =E2=80=94
> On line 21 I am dutifully grabbing the outermost TEI elements using =
!*=E2=80=8B instead of /*=E2=80=8B, in order not to force Saxon to hold =
the entire collection in memory at once. But is that a problem? Do I =
want to force them to be in order?
> This program rests entirely on the idea that collection() and =
uri-collection() return stuff in the same order, whatever that order is. =
Is that true in general?
Firstly I don't think you've set the option =
Feature.STABLE_COLLECTION_URI which is needed to get this guarantee. =
Secondly, bug 5067 suggests you might get a different order anyway =
unless you disable multithreading.


> If it is true in general, Is it rendered false by =
=E2=80=9Con-error=3Dignore=E2=80=9D? If we had a file whose URI =
uri-collection() could grab, but whose content caused an error for =
collection(), would the two sequences have a different number of items? =
(In which case my comparison by position would fail.)
Yes, that would definitely cause a problem.
> Is using position() on line 50 OK, or should I really be using =
index-of( $input_TEIs, . )?
Position is fine in principle - or it would be, if the two sequences =
corresponded 1-to-1
> Is there some completely better way to do this, like iterating over =
$input_URIs and reading each one in with doc(), and handing it to a =
template to decorate its outermost element with =E2=80=9Cfile=3D{$file}=E2=
=80=9D?
Yes. If you're processing all the documents, use collection() to get =
them and document-uri() to find their URIs. If you're filtering on the =
URIs, use uri-collection to get the URIs, and doc() to get the =
documents.
> If I declare $idx on line 50 as xs:positiveInteger I get yelled at, =
because it needs to be an xs:integer. What=E2=80=99s the point of having =
a datatype system with inheritance if I can=E2=80=99t use a derived =
datatype to be more precise?
I agree with you entirely on that. I lost the argument in the WG. It =
gets deep into programming language type theory religion, but the =
essence is that positiveInteger is a label attached to an object that =
holds an integer, not a predicate that integers can be tested against. =
By draft proposals for 4.0 fix it.
> Along the same lines, I note that $myURI (line 51) is declared as =
xs:anyURI, but is not cast to a string before being handed to =
tokenize(), the signature for which says it wants an xs:string.
Yes, in a rare concession to user-friendliness, the WG defined that =
xs:anyURI is "promoted" to xs:string, rather like integer gets promoted =
to xs:double.

Michael Kay
Saxonica


> Hope I=E2=80=99m not being too stupid. Thoughts appreciated.
> =
<colls_fns_doc_order.xslt>_______________________________________________
> saxon-help mailing list archived at http://saxon.markmail.org/ =
<http://saxon.markmail.org/>
> [email protected] =
<mailto:[email protected]>
> https://lists.sourceforge.net/lists/listinfo/saxon-help =
<https://lists.sourceforge.net/lists/listinfo/saxon-help>

--Apple-Mail=_0353210E-3D86-418C-A967-577ABCFAF5B3
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html; =
charset=3Dutf-8"></head><body style=3D"word-wrap: break-word; =
-webkit-nbsp-mode: space; line-break: after-white-space;" =
class=3D"">Firstly, suppose you do<div class=3D""><br =
class=3D""></div><div class=3D"">&lt;xsl:apply-templates =
select=3D"doc('abc.xml') | doc('def.xml')"/&gt;</div><div class=3D""><br =
class=3D""></div><div class=3D"">If neither of these documents has been =
seen before, Saxon will read them in the order specified, will allocate =
them internal sequential document numbers, and the document numbers will =
determine document order, so after the union operation (which sorts into =
document order), abc.xml will come first.</div><div class=3D""><br =
class=3D""></div><div class=3D"">But suppose def.xml has already been =
seen earlier? In that case its document number will be lower than that =
of abc.xml, and it will therefore sort before abc.xml , which means in =
the result of the union operation, def.xml will come first.</div><div =
class=3D""><br class=3D""></div><div class=3D"">The same is true if the =
two documents are members of a collection and you read the collection. =
Except that it's complicated in Saxon-EE because collections are =
processed in parallel, which means that the order the documents are read =
may vary from one run to the next.</div><div class=3D""><br =
class=3D""></div><div class=3D"">There's an open bug here,&nbsp;<a =
href=3D"https://saxonica.plan.io/issues/5067" =
class=3D"">https://saxonica.plan.io/issues/5067</a>, which concerns the =
repeatability of the order of items in a collection, and which might =
well be relevant here. Generally it's a bad idea to read the same =
collection twice. It's inefficient, for starters, and it also gives you =
problems with collection stability (what happens if things change on =
disk?).<br class=3D""><div><br class=3D""><blockquote type=3D"cite" =
class=3D""><div class=3D""><br class=3D""></div><div class=3D""><div =
style=3D"font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; font-family: =
Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;" class=3D"">I =
would like to process a subset of files in a set of directories. Seems =
like a job for the collection() function. But the process I am thinking =
of (as most of my processes) needs to know the input file=E2=80=99s =
path. Well, the uri-collection() function seems like the ticket, =
eh?</div></div></blockquote><div><br class=3D""></div>Yes. You could =
also use collection() and then apply document-uri() to the returned =
documents, but if you want to filter based on the URI, then =
uri-collection() will be more efficient.<br class=3D""><blockquote =
type=3D"cite" class=3D""><div class=3D""><div style=3D"font-style: =
normal; font-variant-caps: normal; font-weight: normal; letter-spacing: =
normal; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; font-family: Calibri, Arial, Helvetica, =
sans-serif; font-size: 12pt;" class=3D""><br class=3D""></div><div =
style=3D"font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; font-family: =
Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;" class=3D"">But =
I note the<span class=3D"Apple-converted-space">&nbsp;</span><a =
href=3D"https://www.saxonica.com/html/documentation10/sourcedocs/collectio=
ns/" =
title=3D"https://www.saxonica.com/html/documentation10/sourcedocs/collecti=
ons/" class=3D"">documentation</a><span =
class=3D"Apple-converted-space">&nbsp;</span>says that the nodes =
returned by collection() (and I presume uri-collection(), too?) are not =
necessarily in document order. First off, I do not entirely grok what =
=E2=80=9Cdocument order=E2=80=9D means with respect to a collection of =
files. (Perhaps =E2=80=9Cthe order your OS returns them in=E2=80=9D or =
=E2=80=9Cthe same order as you got last time=E2=80=9D or =E2=80=9Calphabet=
ic order=E2=80=9D?) But it doesn=E2=80=99t really matter to me what =
order the files are presented in, but to use uri-collection() to get the =
names and collection() to get the corresponding file=E2=80=99s contents, =
it matters that the two functions return the file(name)s in the<span =
class=3D"Apple-converted-space">&nbsp;</span><i class=3D"">same</i><span =
class=3D"Apple-converted-space">&nbsp;</span>order, whatever it =
is.</div></div></blockquote><div><br class=3D""></div>I would use =
uri-collection() to get the URIs and then use doc() to retrieve the URIs =
you are interested in.<br class=3D""><blockquote type=3D"cite" =
class=3D""><div class=3D""><div style=3D"font-style: normal; =
font-variant-caps: normal; font-weight: normal; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; font-family: Calibri, Arial, Helvetica, =
sans-serif; font-size: 12pt;" class=3D""><br class=3D""></div><div =
style=3D"font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; font-family: =
Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;" class=3D"">The =
attached (useless) program demonstrates what I am trying to do. In this =
case, process all of the files in my ~/Documents/whatever/one/, =
~/Documents/whatever/two/, and ~/Documents/whatever/three/ directories =
that start with the letter =E2=80=98r=E2=80=99, have a dot in the =
middle, and end with the extension =E2=80=9C.odd=E2=80=9D, =E2=80=9C.tei=E2=
=80=9D, or =E2=80=9C.xml=E2=80=9D. Note to TEI folks =E2=80=94 for the =
purposes of this discussion<span =
class=3D"Apple-converted-space">&nbsp;</span><i class=3D"">every</i><span =
class=3D"Apple-converted-space">&nbsp;</span>document has an outermost =
element of &lt;TEI&gt;, and<span =
class=3D"Apple-converted-space">&nbsp;</span><i class=3D"">each</i><span =
class=3D"Apple-converted-space">&nbsp;</span>header has one and only one =
&lt;idno&gt; in the &lt;publicationStmt&gt;. Yes, TEI allows variations, =
but this is about collection(), not how to find stuff in a TEI =
document.<span class=3D"Apple-converted-space">&nbsp;</span><span =
id=3D"=F0=9F=99=82" contenteditable=3D"false" class=3D"">=F0=9F=99=82</spa=
n><br class=3D""></div><div style=3D"font-style: normal; =
font-variant-caps: normal; font-weight: normal; letter-spacing: normal; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; font-family: Calibri, Arial, Helvetica, =
sans-serif; font-size: 12pt;" class=3D""><br class=3D""></div><div =
style=3D"font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; font-family: =
Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;" =
class=3D"">Questions, in rough order of importance (in some sense of =
=E2=80=9Cimportance=E2=80=9D :-) =E2=80=94</div><div style=3D"font-style: =
normal; font-variant-caps: normal; font-weight: normal; letter-spacing: =
normal; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; font-family: Calibri, Arial, Helvetica, =
sans-serif; font-size: 12pt;" class=3D""><ul class=3D""><li class=3D"">On =
line 21 I am dutifully grabbing the outermost TEI elements using<span =
class=3D"Apple-converted-space">&nbsp;</span><code class=3D"">!*</code>=E2=
=80=8B instead of<span class=3D"Apple-converted-space">&nbsp;</span><code =
class=3D"">/*</code>=E2=80=8B, in order not to force Saxon to hold the =
entire collection in memory at once. But is that a problem? Do I<span =
class=3D"Apple-converted-space">&nbsp;</span><i class=3D"">want</i><span =
class=3D"Apple-converted-space">&nbsp;</span>to force them to be in =
order?</li><li class=3D"">This program rests entirely on the idea that =
collection() and uri-collection() return stuff in the same order, =
whatever that order is. Is that true in =
general?</li></ul></div></div></blockquote><div>Firstly I don't think =
you've set the option&nbsp;<span style=3D"font-family: &quot;JetBrains =
Mono&quot;, monospace; font-size: 9.8pt; background-color: rgb(255, 255, =
255);" class=3D"">Feature</span><span style=3D"color: rgb(8, 8, 8); =
font-family: &quot;JetBrains Mono&quot;, monospace; font-size: 9.8pt; =
background-color: rgb(255, 255, 255);" class=3D"">.</span><span =
style=3D"font-family: &quot;JetBrains Mono&quot;, monospace; font-size: =
9.8pt; background-color: rgb(255, 255, 255); color: rgb(135, 16, 148); =
font-style: italic;" class=3D"">STABLE_COLLECTION_URI&nbsp;</span>which =
is needed to get this guarantee. Secondly, bug 5067 suggests you might =
get a different order anyway unless you disable =
multithreading.</div><div class=3D""><br class=3D""></div><br =
class=3D""><blockquote type=3D"cite" class=3D""><div class=3D""><div =
style=3D"font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; font-family: =
Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;" class=3D""><ul =
class=3D""><li class=3D"">If it is true in general, Is it rendered false =
by =E2=80=9Con-error=3Dignore=E2=80=9D? If we had a file whose URI =
uri-collection() could grab, but whose content caused an error for =
collection(), would the two sequences have a different number of items? =
(In which case my comparison by position would =
fail.)</li></ul></div></div></blockquote>Yes, that would definitely =
cause a problem.<br class=3D""><blockquote type=3D"cite" class=3D""><div =
class=3D""><div style=3D"font-style: normal; font-variant-caps: normal; =
font-weight: normal; letter-spacing: normal; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: =
none; font-family: Calibri, Arial, Helvetica, sans-serif; font-size: =
12pt;" class=3D""><ul class=3D""><li class=3D"">Is using position() on =
line 50 OK, or should I really be using&nbsp;<span style=3D"font-family: =
&quot;Courier New&quot;, monospace;" class=3D"">index-of( $input_TEIs, . =
)</span>?</li></ul></div></div></blockquote>Position is fine in =
principle - or it would be, if the two sequences corresponded 1-to-1<br =
class=3D""><blockquote type=3D"cite" class=3D""><div class=3D""><div =
style=3D"font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; font-family: =
Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;" class=3D""><ul =
class=3D""><li class=3D"">Is there some completely better way to do =
this, like iterating over $input_URIs and reading each one in with =
doc(), and handing it to a template to decorate its outermost element =
with =E2=80=9Cfile=3D{$file}=E2=80=9D?<br =
class=3D""></li></ul></div></div></blockquote>Yes. If you're processing =
all the documents, use collection() to get them and document-uri() to =
find their URIs. If you're filtering on the URIs, use uri-collection to =
get the URIs, and doc() to get the documents.<br class=3D""><blockquote =
type=3D"cite" class=3D""><div class=3D""><div style=3D"font-style: =
normal; font-variant-caps: normal; font-weight: normal; letter-spacing: =
normal; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none; font-family: Calibri, Arial, Helvetica, =
sans-serif; font-size: 12pt;" class=3D""><ul class=3D""><li class=3D"">If =
I declare $idx on line 50 as xs:positiveInteger I get yelled at, because =
it needs to be an xs:integer. What=E2=80=99s the point of having a =
datatype system with inheritance if I can=E2=80=99t use a derived =
datatype to be more precise?</li></ul></div></div></blockquote>I agree =
with you entirely on that. I lost the argument in the WG. It gets deep =
into programming language type theory religion, but the essence is that =
positiveInteger is a label attached to an object that holds an integer, =
not a predicate that integers can be tested against. By draft proposals =
for 4.0 fix it.<br class=3D""><blockquote type=3D"cite" class=3D""><div =
class=3D""><div style=3D"font-style: normal; font-variant-caps: normal; =
font-weight: normal; letter-spacing: normal; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: =
none; font-family: Calibri, Arial, Helvetica, sans-serif; font-size: =
12pt;" class=3D""><ul class=3D""><li class=3D"">Along the same lines, I =
note that $myURI (line 51) is declared as xs:anyURI, but is not cast to =
a string before being handed to tokenize(), the signature for which says =
it wants an xs:string.</li></ul></div></div></blockquote>Yes, in a rare =
concession to user-friendliness, the WG defined that xs:anyURI is =
"promoted" to xs:string, rather like integer gets promoted to =
xs:double.</div><div><br class=3D""></div><div>Michael =
Kay</div><div>Saxonica</div><div><br class=3D""></div><div><br =
class=3D""><blockquote type=3D"cite" class=3D""><div class=3D""><div =
style=3D"font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; font-family: =
Calibri, Arial, Helvetica, sans-serif; font-size: 12pt;" class=3D""><div =
class=3D"">Hope I=E2=80=99m not being too stupid. Thoughts =
appreciated.<br class=3D""></div></div><span =
id=3D"cid:FB521618-B57B-4051-9B45-6D8519478AB4">&lt;colls_fns_doc_order.xs=
lt&gt;</span><span style=3D"caret-color: rgb(0, 0, 0); font-family: =
Helvetica; font-size: 13px; font-style: normal; font-variant-caps: =
normal; font-weight: normal; letter-spacing: normal; text-align: start; =
text-indent: 0px; text-transform: none; white-space: normal; =
word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: =
none; float: none; display: inline !important;" =
class=3D"">_______________________________________________</span><br =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
13px; font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none;" class=3D""><span =
style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
13px; font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;" class=3D"">saxon-help mailing list archived =
at<span class=3D"Apple-converted-space">&nbsp;</span></span><a =
href=3D"http://saxon.markmail.org/" style=3D"font-family: Helvetica; =
font-size: 13px; font-style: normal; font-variant-caps: normal; =
font-weight: normal; letter-spacing: normal; orphans: auto; text-align: =
start; text-indent: 0px; text-transform: none; white-space: normal; =
widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; =
-webkit-text-stroke-width: 0px;" =
class=3D"">http://saxon.markmail.org/</a><br style=3D"caret-color: =
rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: =
normal; font-variant-caps: normal; font-weight: normal; letter-spacing: =
normal; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;" class=3D""><a =
href=3D"mailto:[email protected]" style=3D"font-family: =
Helvetica; font-size: 13px; font-style: normal; font-variant-caps: =
normal; font-weight: normal; letter-spacing: normal; orphans: auto; =
text-align: start; text-indent: 0px; text-transform: none; white-space: =
normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; =
-webkit-text-stroke-width: 0px;" =
class=3D"">[email protected]</a><br style=3D"caret-color: =
rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: =
normal; font-variant-caps: normal; font-weight: normal; letter-spacing: =
normal; text-align: start; text-indent: 0px; text-transform: none; =
white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; =
text-decoration: none;" class=3D""><a =
href=3D"https://lists.sourceforge.net/lists/listinfo/saxon-help" =
style=3D"font-family: Helvetica; font-size: 13px; font-style: normal; =
font-variant-caps: normal; font-weight: normal; letter-spacing: normal; =
orphans: auto; text-align: start; text-indent: 0px; text-transform: =
none; white-space: normal; widows: auto; word-spacing: 0px; =
-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" =
class=3D"">https://lists.sourceforge.net/lists/listinfo/saxon-help</a><spa=
n style=3D"caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: =
13px; font-style: normal; font-variant-caps: normal; font-weight: =
normal; letter-spacing: normal; text-align: start; text-indent: 0px; =
text-transform: none; white-space: normal; word-spacing: 0px; =
-webkit-text-stroke-width: 0px; text-decoration: none; float: none; =
display: inline !important;" =
class=3D""></span></div></blockquote></div><br =
class=3D""></div></body></html>=

--Apple-Mail=_0353210E-3D86-418C-A967-577ABCFAF5B3--


--===============6014015109945595841==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--===============6014015109945595841==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
saxon-help mailing list archived at http://saxon.markmail.org/
[email protected]
https://lists.sourceforge.net/lists/listinfo/saxon-help 
--===============6014015109945595841==--