xommelier 0.1.21 → 0.1.22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/lib/xommelier/rss.rb +2 -2
- data/lib/xommelier/schemas/atom.xsd +241 -240
- data/lib/xommelier/schemas/opensearch.xsd +1 -0
- data/lib/xommelier/schemas/rss.xsd +23 -22
- data/lib/xommelier/schemas/sitemap.xsd +1 -0
- data/lib/xommelier/schemas/xml.xsd +287 -0
- data/lib/xommelier/schemas/xsd.xsl +997 -0
- data/lib/xommelier/version.rb +1 -1
- data/lib/xommelier/xml.rb +4 -23
- data/lib/xommelier/xml/element.rb +7 -22
- data/lib/xommelier/xml/element/namespace.rb +83 -0
- data/lib/xommelier/xml/element/serialization.rb +17 -2
- data/lib/xommelier/xml/element/structure.rb +35 -39
- data/lib/xommelier/xml/schema.rb +68 -0
- data/spec/fixtures/atom.rng.xml +597 -597
- data/spec/functional/xommelier/rss/rss/building_spec.rb +1 -0
- metadata +9 -20
@@ -1,4 +1,5 @@
|
|
1
1
|
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<?xml-stylesheet href="xsd.xsl" type="text/xsl"?>
|
2
3
|
<!--
|
3
4
|
Downloaded from http://opensearchvalidator.codeplex.com/SourceControl/changeset/view/e180bfbcbb86#TathamOddie.OpenSearchValidator.Logic/Resources/OpenSearchDescription.xsd
|
4
5
|
-->
|
@@ -1,12 +1,13 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<?xml-stylesheet href="xsd.xsl" type="text/xsl"?>
|
2
3
|
<!--
|
3
4
|
XML Schema for RSS v2.0
|
4
5
|
Copyright (C) 2003-2008 Jorgen Thelin
|
5
6
|
|
6
7
|
Microsoft Public License (Ms-PL)
|
7
8
|
|
8
|
-
This license governs use of the accompanying software.
|
9
|
-
If you use the software, you accept this license.
|
9
|
+
This license governs use of the accompanying software.
|
10
|
+
If you use the software, you accept this license.
|
10
11
|
If you do not accept the license, do not use the software.
|
11
12
|
|
12
13
|
1. Definitions
|
@@ -35,11 +36,11 @@ The terms "reproduce," "reproduction," "derivative works," and "distribution" ha
|
|
35
36
|
|
36
37
|
(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
|
37
38
|
|
38
|
-
(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
|
39
|
+
(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
|
39
40
|
|
40
41
|
-->
|
41
|
-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
42
|
-
elementFormDefault="unqualified"
|
42
|
+
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
43
|
+
elementFormDefault="unqualified"
|
43
44
|
version="2.0.2.16">
|
44
45
|
<xs:annotation>
|
45
46
|
<xs:documentation>XML Schema for RSS v2.0 feed files.</xs:documentation>
|
@@ -230,10 +231,10 @@ The terms "reproduce," "reproduction," "derivative works," and "distribution" ha
|
|
230
231
|
</xs:any>
|
231
232
|
</xs:choice>
|
232
233
|
<xs:element name="item" type="RssItem" minOccurs="1" maxOccurs="unbounded">
|
233
|
-
<!--
|
234
|
-
HACK: According to the RSS 2.0 spec, it should strictly be possible to have zero item elements,
|
234
|
+
<!--
|
235
|
+
HACK: According to the RSS 2.0 spec, it should strictly be possible to have zero item elements,
|
235
236
|
but this makes the schema non-deterministic with regard to extensibility elements
|
236
|
-
so for the moment we undid bug-fix 10231 and set minOccurs=1 to work around this problem.
|
237
|
+
so for the moment we undid bug-fix 10231 and set minOccurs=1 to work around this problem.
|
237
238
|
-->
|
238
239
|
</xs:element>
|
239
240
|
<xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded">
|
@@ -456,30 +457,30 @@ Date Revision Description
|
|
456
457
|
- Use namespace="##other" on <any>'s to create a more deterministic data model.
|
457
458
|
- Added missing xs:documentation inside xs:annotation at the schema level.
|
458
459
|
- Use xs:language for ISO Language Codes in <language> element.
|
459
|
-
- Change guid to a single declaration. This loses some of the checking of the
|
460
|
-
URL when the contents of the guid is a permaLink, so we will need to add
|
460
|
+
- Change guid to a single declaration. This loses some of the checking of the
|
461
|
+
URL when the contents of the guid is a permaLink, so we will need to add
|
461
462
|
that back in with a regexp pattern.
|
462
463
|
14-Apr-2003 3 Changes to solve some element ordering problems.
|
463
464
|
- Use xs:all in place of xs:sequence to support flexible ordering of elements.
|
464
|
-
Although the ordering constraints for elements is not clear from the
|
465
|
-
original specification, the custom and practice seems to be that
|
465
|
+
Although the ordering constraints for elements is not clear from the
|
466
|
+
original specification, the custom and practice seems to be that
|
466
467
|
element ordering is freeform.
|
467
468
|
- Use elemenfFormDefault="qualified" for explicit intent.
|
468
469
|
15-Apr-2003 4 Changes to solve some element ordering problems.
|
469
470
|
- Use xs:choice in place of xs:all as previous usage of <all> was invalid.
|
470
|
-
This creates the problem that unsufficient constraints can be applied
|
471
|
+
This creates the problem that unsufficient constraints can be applied
|
471
472
|
by the schema - for example, it can't prevent two title elements for an item.
|
472
|
-
- Use elemenfFormDefault="unqualified" for to get the correct behavious
|
473
|
+
- Use elemenfFormDefault="unqualified" for to get the correct behavious
|
473
474
|
when importing and combining schemas.
|
474
|
-
15-Apr-2003 5 Putting the extensibility element inside the repeating choice solves
|
475
|
+
15-Apr-2003 5 Putting the extensibility element inside the repeating choice solves
|
475
476
|
all problems with element ordering.
|
476
|
-
15-Apr-2003 6 - skipHours and skipDays should contain a nested list of values,
|
477
|
+
15-Apr-2003 6 - skipHours and skipDays should contain a nested list of values,
|
477
478
|
not just a single value.
|
478
479
|
- Added version attribute to schema definition.
|
479
480
|
- Corrected type of the cloud element
|
480
481
|
25-Apr-2003 7 - Add regexp for RFC-822 date suggested by Sam Ruby
|
481
|
-
- I had to leave the base type of the tRfc822FormatDate type
|
482
|
-
as xs:string due to the problems with using
|
482
|
+
- I had to leave the base type of the tRfc822FormatDate type
|
483
|
+
as xs:string due to the problems with using
|
483
484
|
a pattern with xs:dateTime described at
|
484
485
|
http://www.thearchitect.co.uk/weblog/archives/2003/04/000142.html
|
485
486
|
19-Jun-2003 8 - Fixed a bug the Oxygen XML Editor spotted in the regexp for RFC-822 dates
|
@@ -488,11 +489,11 @@ Date Revision Description
|
|
488
489
|
24-Jun-2003 10 - Missing types for item/title and item/description - Spotted by Andreas Schwotzer.
|
489
490
|
01-Jan-2008 11 - Copy made available under the Microsoft Public License (MS-PL).
|
490
491
|
25-May-2008 12 - Bug fix 10231 from Ken Gruven - channel can contain zero or more items.
|
491
|
-
06-Sep-2008 13 - Fixed tab-space whitespace issues. Now always use spaces.
|
492
|
-
- Undid the fix for bug-fix 10231 since it made the schema non-deterministic
|
492
|
+
06-Sep-2008 13 - Fixed tab-space whitespace issues. Now always use spaces.
|
493
|
+
- Undid the fix for bug-fix 10231 since it made the schema non-deterministic
|
493
494
|
with respect to extensibility eleemnts in tRssChannel - need to reconsider the fix.
|
494
|
-
08-Sep-2008 14 - Removed 't' prefixes from type names to improve class names
|
495
|
-
that get code-generated from the schema.
|
495
|
+
08-Sep-2008 14 - Removed 't' prefixes from type names to improve class names
|
496
|
+
that get code-generated from the schema.
|
496
497
|
22-Sep-2008 15 - Move type def for rss element in-line for improved compativility with Java 1.6 tools.
|
497
498
|
01-Nov-2008 16 - Added the missing rating element from the spec to RssChannel.
|
498
499
|
-->
|
@@ -0,0 +1,287 @@
|
|
1
|
+
<?xml version='1.0'?>
|
2
|
+
<?xml-stylesheet href="xsd.xsl" type="text/xsl"?>
|
3
|
+
<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
|
4
|
+
xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
5
|
+
xmlns ="http://www.w3.org/1999/xhtml"
|
6
|
+
xml:lang="en">
|
7
|
+
|
8
|
+
<xs:annotation>
|
9
|
+
<xs:documentation>
|
10
|
+
<div>
|
11
|
+
<h1>About the XML namespace</h1>
|
12
|
+
|
13
|
+
<div class="bodytext">
|
14
|
+
<p>
|
15
|
+
This schema document describes the XML namespace, in a form
|
16
|
+
suitable for import by other schema documents.
|
17
|
+
</p>
|
18
|
+
<p>
|
19
|
+
See <a href="http://www.w3.org/XML/1998/namespace.html">
|
20
|
+
http://www.w3.org/XML/1998/namespace.html</a> and
|
21
|
+
<a href="http://www.w3.org/TR/REC-xml">
|
22
|
+
http://www.w3.org/TR/REC-xml</a> for information
|
23
|
+
about this namespace.
|
24
|
+
</p>
|
25
|
+
<p>
|
26
|
+
Note that local names in this namespace are intended to be
|
27
|
+
defined only by the World Wide Web Consortium or its subgroups.
|
28
|
+
The names currently defined in this namespace are listed below.
|
29
|
+
They should not be used with conflicting semantics by any Working
|
30
|
+
Group, specification, or document instance.
|
31
|
+
</p>
|
32
|
+
<p>
|
33
|
+
See further below in this document for more information about <a
|
34
|
+
href="#usage">how to refer to this schema document from your own
|
35
|
+
XSD schema documents</a> and about <a href="#nsversioning">the
|
36
|
+
namespace-versioning policy governing this schema document</a>.
|
37
|
+
</p>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</xs:documentation>
|
41
|
+
</xs:annotation>
|
42
|
+
|
43
|
+
<xs:attribute name="lang">
|
44
|
+
<xs:annotation>
|
45
|
+
<xs:documentation>
|
46
|
+
<div>
|
47
|
+
|
48
|
+
<h3>lang (as an attribute name)</h3>
|
49
|
+
<p>
|
50
|
+
denotes an attribute whose value
|
51
|
+
is a language code for the natural language of the content of
|
52
|
+
any element; its value is inherited. This name is reserved
|
53
|
+
by virtue of its definition in the XML specification.</p>
|
54
|
+
|
55
|
+
</div>
|
56
|
+
<div>
|
57
|
+
<h4>Notes</h4>
|
58
|
+
<p>
|
59
|
+
Attempting to install the relevant ISO 2- and 3-letter
|
60
|
+
codes as the enumerated possible values is probably never
|
61
|
+
going to be a realistic possibility.
|
62
|
+
</p>
|
63
|
+
<p>
|
64
|
+
See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
|
65
|
+
http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
|
66
|
+
and the IANA language subtag registry at
|
67
|
+
<a href="http://www.iana.org/assignments/language-subtag-registry">
|
68
|
+
http://www.iana.org/assignments/language-subtag-registry</a>
|
69
|
+
for further information.
|
70
|
+
</p>
|
71
|
+
<p>
|
72
|
+
The union allows for the 'un-declaration' of xml:lang with
|
73
|
+
the empty string.
|
74
|
+
</p>
|
75
|
+
</div>
|
76
|
+
</xs:documentation>
|
77
|
+
</xs:annotation>
|
78
|
+
<xs:simpleType>
|
79
|
+
<xs:union memberTypes="xs:language">
|
80
|
+
<xs:simpleType>
|
81
|
+
<xs:restriction base="xs:string">
|
82
|
+
<xs:enumeration value=""/>
|
83
|
+
</xs:restriction>
|
84
|
+
</xs:simpleType>
|
85
|
+
</xs:union>
|
86
|
+
</xs:simpleType>
|
87
|
+
</xs:attribute>
|
88
|
+
|
89
|
+
<xs:attribute name="space">
|
90
|
+
<xs:annotation>
|
91
|
+
<xs:documentation>
|
92
|
+
<div>
|
93
|
+
|
94
|
+
<h3>space (as an attribute name)</h3>
|
95
|
+
<p>
|
96
|
+
denotes an attribute whose
|
97
|
+
value is a keyword indicating what whitespace processing
|
98
|
+
discipline is intended for the content of the element; its
|
99
|
+
value is inherited. This name is reserved by virtue of its
|
100
|
+
definition in the XML specification.</p>
|
101
|
+
|
102
|
+
</div>
|
103
|
+
</xs:documentation>
|
104
|
+
</xs:annotation>
|
105
|
+
<xs:simpleType>
|
106
|
+
<xs:restriction base="xs:NCName">
|
107
|
+
<xs:enumeration value="default"/>
|
108
|
+
<xs:enumeration value="preserve"/>
|
109
|
+
</xs:restriction>
|
110
|
+
</xs:simpleType>
|
111
|
+
</xs:attribute>
|
112
|
+
|
113
|
+
<xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
|
114
|
+
<xs:documentation>
|
115
|
+
<div>
|
116
|
+
|
117
|
+
<h3>base (as an attribute name)</h3>
|
118
|
+
<p>
|
119
|
+
denotes an attribute whose value
|
120
|
+
provides a URI to be used as the base for interpreting any
|
121
|
+
relative URIs in the scope of the element on which it
|
122
|
+
appears; its value is inherited. This name is reserved
|
123
|
+
by virtue of its definition in the XML Base specification.</p>
|
124
|
+
|
125
|
+
<p>
|
126
|
+
See <a
|
127
|
+
href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
|
128
|
+
for information about this attribute.
|
129
|
+
</p>
|
130
|
+
</div>
|
131
|
+
</xs:documentation>
|
132
|
+
</xs:annotation>
|
133
|
+
</xs:attribute>
|
134
|
+
|
135
|
+
<xs:attribute name="id" type="xs:ID">
|
136
|
+
<xs:annotation>
|
137
|
+
<xs:documentation>
|
138
|
+
<div>
|
139
|
+
|
140
|
+
<h3>id (as an attribute name)</h3>
|
141
|
+
<p>
|
142
|
+
denotes an attribute whose value
|
143
|
+
should be interpreted as if declared to be of type ID.
|
144
|
+
This name is reserved by virtue of its definition in the
|
145
|
+
xml:id specification.</p>
|
146
|
+
|
147
|
+
<p>
|
148
|
+
See <a
|
149
|
+
href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
|
150
|
+
for information about this attribute.
|
151
|
+
</p>
|
152
|
+
</div>
|
153
|
+
</xs:documentation>
|
154
|
+
</xs:annotation>
|
155
|
+
</xs:attribute>
|
156
|
+
|
157
|
+
<xs:attributeGroup name="specialAttrs">
|
158
|
+
<xs:attribute ref="xml:base"/>
|
159
|
+
<xs:attribute ref="xml:lang"/>
|
160
|
+
<xs:attribute ref="xml:space"/>
|
161
|
+
<xs:attribute ref="xml:id"/>
|
162
|
+
</xs:attributeGroup>
|
163
|
+
|
164
|
+
<xs:annotation>
|
165
|
+
<xs:documentation>
|
166
|
+
<div>
|
167
|
+
|
168
|
+
<h3>Father (in any context at all)</h3>
|
169
|
+
|
170
|
+
<div class="bodytext">
|
171
|
+
<p>
|
172
|
+
denotes Jon Bosak, the chair of
|
173
|
+
the original XML Working Group. This name is reserved by
|
174
|
+
the following decision of the W3C XML Plenary and
|
175
|
+
XML Coordination groups:
|
176
|
+
</p>
|
177
|
+
<blockquote>
|
178
|
+
<p>
|
179
|
+
In appreciation for his vision, leadership and
|
180
|
+
dedication the W3C XML Plenary on this 10th day of
|
181
|
+
February, 2000, reserves for Jon Bosak in perpetuity
|
182
|
+
the XML name "xml:Father".
|
183
|
+
</p>
|
184
|
+
</blockquote>
|
185
|
+
</div>
|
186
|
+
</div>
|
187
|
+
</xs:documentation>
|
188
|
+
</xs:annotation>
|
189
|
+
|
190
|
+
<xs:annotation>
|
191
|
+
<xs:documentation>
|
192
|
+
<div xml:id="usage" id="usage">
|
193
|
+
<h2><a name="usage">About this schema document</a></h2>
|
194
|
+
|
195
|
+
<div class="bodytext">
|
196
|
+
<p>
|
197
|
+
This schema defines attributes and an attribute group suitable
|
198
|
+
for use by schemas wishing to allow <code>xml:base</code>,
|
199
|
+
<code>xml:lang</code>, <code>xml:space</code> or
|
200
|
+
<code>xml:id</code> attributes on elements they define.
|
201
|
+
</p>
|
202
|
+
<p>
|
203
|
+
To enable this, such a schema must import this schema for
|
204
|
+
the XML namespace, e.g. as follows:
|
205
|
+
</p>
|
206
|
+
<pre>
|
207
|
+
<schema . . .>
|
208
|
+
. . .
|
209
|
+
<import namespace="http://www.w3.org/XML/1998/namespace"
|
210
|
+
schemaLocation="http://www.w3.org/2001/xml.xsd"/>
|
211
|
+
</pre>
|
212
|
+
<p>
|
213
|
+
or
|
214
|
+
</p>
|
215
|
+
<pre>
|
216
|
+
<import namespace="http://www.w3.org/XML/1998/namespace"
|
217
|
+
schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
|
218
|
+
</pre>
|
219
|
+
<p>
|
220
|
+
Subsequently, qualified reference to any of the attributes or the
|
221
|
+
group defined below will have the desired effect, e.g.
|
222
|
+
</p>
|
223
|
+
<pre>
|
224
|
+
<type . . .>
|
225
|
+
. . .
|
226
|
+
<attributeGroup ref="xml:specialAttrs"/>
|
227
|
+
</pre>
|
228
|
+
<p>
|
229
|
+
will define a type which will schema-validate an instance element
|
230
|
+
with any of those attributes.
|
231
|
+
</p>
|
232
|
+
</div>
|
233
|
+
</div>
|
234
|
+
</xs:documentation>
|
235
|
+
</xs:annotation>
|
236
|
+
|
237
|
+
<xs:annotation>
|
238
|
+
<xs:documentation>
|
239
|
+
<div id="nsversioning" xml:id="nsversioning">
|
240
|
+
<h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
|
241
|
+
<div class="bodytext">
|
242
|
+
<p>
|
243
|
+
In keeping with the XML Schema WG's standard versioning
|
244
|
+
policy, this schema document will persist at
|
245
|
+
<a href="http://www.w3.org/2009/01/xml.xsd">
|
246
|
+
http://www.w3.org/2009/01/xml.xsd</a>.
|
247
|
+
</p>
|
248
|
+
<p>
|
249
|
+
At the date of issue it can also be found at
|
250
|
+
<a href="http://www.w3.org/2001/xml.xsd">
|
251
|
+
http://www.w3.org/2001/xml.xsd</a>.
|
252
|
+
</p>
|
253
|
+
<p>
|
254
|
+
The schema document at that URI may however change in the future,
|
255
|
+
in order to remain compatible with the latest version of XML
|
256
|
+
Schema itself, or with the XML namespace itself. In other words,
|
257
|
+
if the XML Schema or XML namespaces change, the version of this
|
258
|
+
document at <a href="http://www.w3.org/2001/xml.xsd">
|
259
|
+
http://www.w3.org/2001/xml.xsd
|
260
|
+
</a>
|
261
|
+
will change accordingly; the version at
|
262
|
+
<a href="http://www.w3.org/2009/01/xml.xsd">
|
263
|
+
http://www.w3.org/2009/01/xml.xsd
|
264
|
+
</a>
|
265
|
+
will not change.
|
266
|
+
</p>
|
267
|
+
<p>
|
268
|
+
Previous dated (and unchanging) versions of this schema
|
269
|
+
document are at:
|
270
|
+
</p>
|
271
|
+
<ul>
|
272
|
+
<li><a href="http://www.w3.org/2009/01/xml.xsd">
|
273
|
+
http://www.w3.org/2009/01/xml.xsd</a></li>
|
274
|
+
<li><a href="http://www.w3.org/2007/08/xml.xsd">
|
275
|
+
http://www.w3.org/2007/08/xml.xsd</a></li>
|
276
|
+
<li><a href="http://www.w3.org/2004/10/xml.xsd">
|
277
|
+
http://www.w3.org/2004/10/xml.xsd</a></li>
|
278
|
+
<li><a href="http://www.w3.org/2001/03/xml.xsd">
|
279
|
+
http://www.w3.org/2001/03/xml.xsd</a></li>
|
280
|
+
</ul>
|
281
|
+
</div>
|
282
|
+
</div>
|
283
|
+
</xs:documentation>
|
284
|
+
</xs:annotation>
|
285
|
+
|
286
|
+
</xs:schema>
|
287
|
+
|
@@ -0,0 +1,997 @@
|
|
1
|
+
<!DOCTYPE xsl:stylesheet [
|
2
|
+
<!--*
|
3
|
+
<!DOCTYPE xsl:stylesheet PUBLIC 'http://www.w3.org/1999/XSL/Transform'
|
4
|
+
'../../People/cmsmcq/lib/xslt10.dtd' [
|
5
|
+
*-->
|
6
|
+
<!ATTLIST xsl:stylesheet
|
7
|
+
xmlns:xsl CDATA "http://www.w3.org/1999/XSL/Transform"
|
8
|
+
xmlns:xsd CDATA #IMPLIED
|
9
|
+
xmlns:xhtml CDATA #IMPLIED
|
10
|
+
>
|
11
|
+
<!ATTLIST xsl:text
|
12
|
+
xmlns:xsl CDATA "http://www.w3.org/1999/XSL/Transform"
|
13
|
+
>
|
14
|
+
|
15
|
+
<!ENTITY copy "©" ><!--=copyright sign-->
|
16
|
+
<!ENTITY reg "®" ><!--/circledR =registered sign-->
|
17
|
+
<!ENTITY rarr "→" ><!--/rightarrow /to A: =rightward arrow-->
|
18
|
+
|
19
|
+
<!ENTITY nl "
">
|
20
|
+
<!ENTITY lsquo "‘" ><!--=single quotation mark, left-->
|
21
|
+
<!ENTITY rsquo "’" ><!--=single quotation mark, right-->
|
22
|
+
<!ENTITY ldquo "“" ><!--=double quotation mark, left-->
|
23
|
+
<!ENTITY rdquo "”" ><!--=double quotation mark, right-->
|
24
|
+
|
25
|
+
]>
|
26
|
+
<xsl:stylesheet version="1.0"
|
27
|
+
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
28
|
+
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
29
|
+
xmlns:xhtml="http://www.w3.org/1999/xhtml"
|
30
|
+
>
|
31
|
+
|
32
|
+
<!--* xsd.xsl: format an XSD schema document for simple display in a Web browser.
|
33
|
+
* http://www.w3.org/XML/2004/xml-schema-test-suite/xsd.xsl
|
34
|
+
*
|
35
|
+
* Copyright © 2008-2009 World Wide Web Consortium, (Massachusetts
|
36
|
+
* Institute of Technology, European Research Consortium for
|
37
|
+
* Informatics and Mathematics, Keio University). All Rights
|
38
|
+
* Reserved. This work is distributed under the W3C® Software
|
39
|
+
* License [1] in the hope that it will be useful, but WITHOUT ANY
|
40
|
+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
41
|
+
* FITNESS FOR A PARTICULAR PURPOSE.
|
42
|
+
*
|
43
|
+
* [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
|
44
|
+
*
|
45
|
+
*-->
|
46
|
+
|
47
|
+
<!--* Revisions:
|
48
|
+
* 2012-05-03 : CMSMcQ : reissue under Software License, not document
|
49
|
+
* license
|
50
|
+
* 2009-01-21 : CMSMcQ : wrap start-tags only when necessary
|
51
|
+
* 2009-01-20 : CMSMcQ : wrap start-tags
|
52
|
+
* 2008-12-19 : CMSMcQ : add toc for schema documents with more than
|
53
|
+
* five children of xsd:schema
|
54
|
+
* 2008-12-18 : CMSMcQ : fix problems with text breaking
|
55
|
+
* add rule for top-level attribute groups
|
56
|
+
* 2008-09-27 : CMSMcQ : made first version of this stylesheet
|
57
|
+
*-->
|
58
|
+
|
59
|
+
<xsl:output method="html" indent="yes"/>
|
60
|
+
|
61
|
+
<xsl:param name="line-wrap-length" select="60"/>
|
62
|
+
<xsl:param name="ind-depth" select="6"/>
|
63
|
+
<xsl:param name="additional-indent" select="substring(
|
64
|
+
' ',
|
65
|
+
1,$ind-depth)"/>
|
66
|
+
|
67
|
+
<xsl:variable name="tns">
|
68
|
+
<xsl:value-of select="/xsd:schema/@targetNamespace"/>
|
69
|
+
</xsl:variable>
|
70
|
+
|
71
|
+
<!--* 0 Document root *-->
|
72
|
+
<xsl:template match="/">
|
73
|
+
|
74
|
+
<xsl:variable name="doctitle">
|
75
|
+
<xsl:text>Schema document for </xsl:text>
|
76
|
+
<xsl:choose>
|
77
|
+
<xsl:when test="xsd:schema/@targetNamespace">
|
78
|
+
<xsl:text>namespace </xsl:text>
|
79
|
+
<xsl:value-of select="$tns"/>
|
80
|
+
</xsl:when>
|
81
|
+
<xsl:otherwise>
|
82
|
+
<xsl:text>unspecified namespace</xsl:text>
|
83
|
+
</xsl:otherwise>
|
84
|
+
</xsl:choose>
|
85
|
+
</xsl:variable>
|
86
|
+
|
87
|
+
<xsl:variable name="docHasHeading" select="
|
88
|
+
xsd:schema/xsd:annotation[1]/xsd:documentation/*[1]
|
89
|
+
[self::xhtml:h1 or self::h1]
|
90
|
+
or
|
91
|
+
xsd:schema/xsd:annotation[1]/xsd:documentation/xhtml:div/*[1]
|
92
|
+
[self::xhtml:h1 or self::h1]
|
93
|
+
"/>
|
94
|
+
<xsl:variable name="docIsProlific" select="
|
95
|
+
count(xsd:schema/child::*) > 5
|
96
|
+
"/>
|
97
|
+
|
98
|
+
<xsl:element name="html">
|
99
|
+
<xsl:element name="head">
|
100
|
+
<xsl:element name="title">
|
101
|
+
<xsl:value-of select="$doctitle"/>
|
102
|
+
</xsl:element>
|
103
|
+
<xsl:element name="style">
|
104
|
+
<xsl:attribute name="type">text/css</xsl:attribute>
|
105
|
+
.bodytext .bodytext {
|
106
|
+
margin-left: 0;
|
107
|
+
margin-right: 0;
|
108
|
+
}
|
109
|
+
.bodytext {
|
110
|
+
margin-left: 15%;
|
111
|
+
margin-right: 2%;
|
112
|
+
}
|
113
|
+
.annotation {
|
114
|
+
<!--* anything special to do here? *-->
|
115
|
+
<!--* color: navy; *-->
|
116
|
+
}
|
117
|
+
.same-ns {
|
118
|
+
color: Green;
|
119
|
+
}
|
120
|
+
.diff-ns {
|
121
|
+
color: maroon;
|
122
|
+
}
|
123
|
+
.warning {
|
124
|
+
color: red;
|
125
|
+
}
|
126
|
+
p.note {
|
127
|
+
font-style: italic;
|
128
|
+
}
|
129
|
+
p.dt {
|
130
|
+
font-weight: bold;
|
131
|
+
}
|
132
|
+
span.rfc {
|
133
|
+
font-variant: small-caps;
|
134
|
+
}
|
135
|
+
</xsl:element>
|
136
|
+
</xsl:element>
|
137
|
+
<xsl:element name="body">
|
138
|
+
|
139
|
+
<xsl:choose>
|
140
|
+
<xsl:when test="$docHasHeading and not($docIsProlific)">
|
141
|
+
<!--* If the first thing in the first documentation element is a heading,
|
142
|
+
* and there are few children, then don't interfere.
|
143
|
+
*-->
|
144
|
+
<xsl:comment>* <xsl:value-of select="$doctitle"/> *</xsl:comment>
|
145
|
+
</xsl:when>
|
146
|
+
<xsl:otherwise>
|
147
|
+
<!--* either document has no heading (and needs one), or
|
148
|
+
* we're going to do a toc and need a heading anyway
|
149
|
+
*-->
|
150
|
+
<xsl:element name="h1">
|
151
|
+
<xsl:value-of select="$doctitle"/>
|
152
|
+
</xsl:element>
|
153
|
+
<xsl:if test="$docIsProlific">
|
154
|
+
<xsl:element name="div">
|
155
|
+
<xsl:element name="hr"/>
|
156
|
+
<xsl:element name="ul">
|
157
|
+
<xsl:attribute name="class">bodytext</xsl:attribute>
|
158
|
+
<xsl:apply-templates mode="toc" select="./xsd:schema/*"/>
|
159
|
+
</xsl:element>
|
160
|
+
<xsl:element name="hr"/>
|
161
|
+
</xsl:element>
|
162
|
+
</xsl:if>
|
163
|
+
</xsl:otherwise>
|
164
|
+
</xsl:choose>
|
165
|
+
<xsl:apply-templates/>
|
166
|
+
</xsl:element>
|
167
|
+
</xsl:element>
|
168
|
+
</xsl:template>
|
169
|
+
|
170
|
+
<!--* 2 Schema element *-->
|
171
|
+
<xsl:template match="xsd:schema">
|
172
|
+
<!--* optional future change: write out information here about
|
173
|
+
* the attributes of xsd:schema: version, finalDefault, blockDefault,
|
174
|
+
* elementFormDefault, atgtributeFormDefault, namespace bindings ...
|
175
|
+
*-->
|
176
|
+
<xsl:apply-templates/>
|
177
|
+
</xsl:template>
|
178
|
+
|
179
|
+
<!--* 3 Anotation *-->
|
180
|
+
<xsl:template match="xsd:annotation">
|
181
|
+
<xsl:element name="div">
|
182
|
+
<xsl:attribute name="class">annotation</xsl:attribute>
|
183
|
+
<xsl:attribute name="id">
|
184
|
+
<xsl:call-template name="leid">
|
185
|
+
</xsl:call-template>
|
186
|
+
</xsl:attribute>
|
187
|
+
<xsl:if test="not(./xsd:documentation//*[@class='bodytext'])">
|
188
|
+
<xsl:element name="h3">Annotation</xsl:element>
|
189
|
+
</xsl:if>
|
190
|
+
<xsl:element name="div">
|
191
|
+
<xsl:choose>
|
192
|
+
<xsl:when test="./xsd:documentation//*[@class='bodytext']">
|
193
|
+
<!--* if the schema document is already using class=bodytext,
|
194
|
+
* let the schema author control the margins, don't
|
195
|
+
* assign the class here.
|
196
|
+
*-->
|
197
|
+
</xsl:when>
|
198
|
+
<xsl:otherwise>
|
199
|
+
<xsl:attribute name="class">bodytext</xsl:attribute>
|
200
|
+
</xsl:otherwise>
|
201
|
+
</xsl:choose>
|
202
|
+
<xsl:apply-templates/>
|
203
|
+
</xsl:element>
|
204
|
+
</xsl:element>
|
205
|
+
</xsl:template>
|
206
|
+
|
207
|
+
<xsl:template match="xsd:documentation">
|
208
|
+
<xsl:choose>
|
209
|
+
<xsl:when test=".//xhtml:* or .//div or .//p or .//li">
|
210
|
+
<xsl:copy-of select="*"/>
|
211
|
+
</xsl:when>
|
212
|
+
<xsl:when test="./*">
|
213
|
+
<xsl:message>! Unrecognized children in xs:documentation element</xsl:message>
|
214
|
+
<xsl:copy-of select="*"/>
|
215
|
+
</xsl:when>
|
216
|
+
<xsl:otherwise>
|
217
|
+
<xsl:call-template name="break-pcdata">
|
218
|
+
<xsl:with-param name="s" select="string(.)"/>
|
219
|
+
</xsl:call-template>
|
220
|
+
</xsl:otherwise>
|
221
|
+
</xsl:choose>
|
222
|
+
</xsl:template>
|
223
|
+
|
224
|
+
<xsl:template name="break-pcdata">
|
225
|
+
<xsl:param name="s"></xsl:param>
|
226
|
+
|
227
|
+
<xsl:choose>
|
228
|
+
<xsl:when test="starts-with($s,'
')">
|
229
|
+
<xsl:text>
</xsl:text>
|
230
|
+
<xsl:element name="br"/>
|
231
|
+
<xsl:call-template name="break-pcdata">
|
232
|
+
<xsl:with-param name="s" select="substring($s,2)"/>
|
233
|
+
</xsl:call-template>
|
234
|
+
</xsl:when>
|
235
|
+
<xsl:when test="starts-with($s,' ')">
|
236
|
+
<xsl:text> </xsl:text>
|
237
|
+
<xsl:call-template name="break-pcdata">
|
238
|
+
<xsl:with-param name="s" select="substring($s,2)"/>
|
239
|
+
</xsl:call-template>
|
240
|
+
</xsl:when>
|
241
|
+
<xsl:when test="contains($s,'
')">
|
242
|
+
<xsl:value-of select="substring-before($s,'
')"/>
|
243
|
+
<xsl:text>
</xsl:text>
|
244
|
+
<xsl:element name="br"/>
|
245
|
+
<xsl:call-template name="break-pcdata">
|
246
|
+
<xsl:with-param name="s" select="substring-after($s,'
')"/>
|
247
|
+
</xsl:call-template>
|
248
|
+
</xsl:when>
|
249
|
+
<xsl:otherwise>
|
250
|
+
<xsl:value-of select="$s"/>
|
251
|
+
</xsl:otherwise>
|
252
|
+
</xsl:choose>
|
253
|
+
</xsl:template>
|
254
|
+
|
255
|
+
<!--* 4 Top-level components *-->
|
256
|
+
<xsl:template match="
|
257
|
+
xsd:schema/xsd:attribute
|
258
|
+
| xsd:schema/xsd:element
|
259
|
+
| xsd:schema/xsd:simpleType
|
260
|
+
| xsd:schema/xsd:complexType
|
261
|
+
| xsd:schema/xsd:attributeGroup
|
262
|
+
| xsd:schema/xsd:import
|
263
|
+
| xsd:schema/xsd:group
|
264
|
+
| xsd:schema/xsd:notation
|
265
|
+
">
|
266
|
+
<xsl:call-template name="show-top-level-component"/>
|
267
|
+
</xsl:template>
|
268
|
+
|
269
|
+
<xsl:template name="show-top-level-component">
|
270
|
+
<xsl:variable name="sort">
|
271
|
+
<xsl:call-template name="sort"/>
|
272
|
+
</xsl:variable>
|
273
|
+
<xsl:variable name="leid">
|
274
|
+
<xsl:call-template name="leid"/>
|
275
|
+
</xsl:variable>
|
276
|
+
<xsl:variable name="has-heading-already">
|
277
|
+
<xsl:choose>
|
278
|
+
<xsl:when test="./xsd:annotation[1]/xsd:documentation/*//*
|
279
|
+
[self::xhtml:*[starts-with(local-name(),'h')]
|
280
|
+
or
|
281
|
+
self::*[contains(' h1 h2 h3 h4 h5 ',local-name())]
|
282
|
+
]">
|
283
|
+
<xsl:value-of select="'true'"/>
|
284
|
+
</xsl:when>
|
285
|
+
<xsl:otherwise>
|
286
|
+
<xsl:value-of select="'false'"/>
|
287
|
+
</xsl:otherwise>
|
288
|
+
</xsl:choose>
|
289
|
+
</xsl:variable>
|
290
|
+
|
291
|
+
<xsl:element name="div">
|
292
|
+
<xsl:attribute name="id">
|
293
|
+
<xsl:value-of select="$leid"/>
|
294
|
+
</xsl:attribute>
|
295
|
+
<xsl:element name="h3">
|
296
|
+
<xsl:element name="a">
|
297
|
+
<xsl:attribute name="name">
|
298
|
+
<xsl:value-of select="$leid"/>
|
299
|
+
</xsl:attribute>
|
300
|
+
<xsl:value-of select="concat($sort,' ')"/>
|
301
|
+
<xsl:choose>
|
302
|
+
<xsl:when test="count(@name) = 1">
|
303
|
+
<xsl:element name="em">
|
304
|
+
<xsl:value-of select="@name"/>
|
305
|
+
</xsl:element>
|
306
|
+
</xsl:when>
|
307
|
+
<xsl:when test="self::xsd:import and (count(@namespace) = 1)">
|
308
|
+
<xsl:element name="code">
|
309
|
+
<xsl:value-of select="@namespace"/>
|
310
|
+
</xsl:element>
|
311
|
+
</xsl:when>
|
312
|
+
</xsl:choose>
|
313
|
+
</xsl:element>
|
314
|
+
</xsl:element>
|
315
|
+
|
316
|
+
<xsl:element name="div">
|
317
|
+
<xsl:attribute name="class">bodytext</xsl:attribute>
|
318
|
+
|
319
|
+
<xsl:if test="./xsd:annotation/xsd:documentation">
|
320
|
+
<xsl:element name="div">
|
321
|
+
<xsl:if test="$has-heading-already = 'false'">
|
322
|
+
<xsl:element name="h4">Notes</xsl:element>
|
323
|
+
</xsl:if><!-- /if .$has-heading-already *-->
|
324
|
+
<xsl:apply-templates select="xsd:annotation/xsd:documentation"/>
|
325
|
+
<xsl:if test="count(./xsd:annotation/xsd:documentation/@source) = 1">
|
326
|
+
<xsl:element name="p">
|
327
|
+
<xsl:text>External documentation at </xsl:text>
|
328
|
+
<xsl:element name="code">
|
329
|
+
<xsl:element name="a">
|
330
|
+
<xsl:attribute name="href">
|
331
|
+
<xsl:value-of select="./xsd:annotation/xsd:documentation/@source"/>
|
332
|
+
</xsl:attribute>
|
333
|
+
<xsl:value-of select="./xsd:annotation/xsd:documentation/@source"/>
|
334
|
+
</xsl:element>
|
335
|
+
</xsl:element>
|
336
|
+
</xsl:element>
|
337
|
+
</xsl:if>
|
338
|
+
</xsl:element>
|
339
|
+
</xsl:if><!-- /if ./xsd:annotation/xsd:documentation *-->
|
340
|
+
|
341
|
+
<xsl:element name="div">
|
342
|
+
<xsl:element name="h4">Formal declaration in XSD source form</xsl:element>
|
343
|
+
<xsl:element name="pre">
|
344
|
+
<xsl:variable name="preceding-node"
|
345
|
+
select="./preceding-sibling::node()[1]"/>
|
346
|
+
<xsl:if test="not($preceding-node/self::*)
|
347
|
+
and (normalize-space($preceding-node) = '')">
|
348
|
+
<xsl:value-of select="$preceding-node"/>
|
349
|
+
</xsl:if>
|
350
|
+
<xsl:apply-templates select="." mode="echo-xml"/>
|
351
|
+
</xsl:element>
|
352
|
+
</xsl:element><!--* div for XSD source form *-->
|
353
|
+
</xsl:element><!--* div for documentation and formal description *-->
|
354
|
+
|
355
|
+
</xsl:element><!--* div for top-level component *-->
|
356
|
+
</xsl:template>
|
357
|
+
|
358
|
+
|
359
|
+
<!--* 5 xml mode *-->
|
360
|
+
<xsl:template match="*" mode="echo-xml">
|
361
|
+
<xsl:variable name="s0">
|
362
|
+
<xsl:call-template name="lastline-suffix">
|
363
|
+
<xsl:with-param name="s0" select="preceding-sibling::text()
|
364
|
+
[string-length(.) > 0][1]" />
|
365
|
+
</xsl:call-template>
|
366
|
+
</xsl:variable>
|
367
|
+
<xsl:variable name="width">
|
368
|
+
<xsl:call-template name="stag-width">
|
369
|
+
<xsl:with-param name="indent-length" select="string-length($s0)"/>
|
370
|
+
</xsl:call-template>
|
371
|
+
</xsl:variable>
|
372
|
+
<!--* <xsl:message>Start-tag width for <xsl:value-of select="name()"/>
|
373
|
+
= <xsl:value-of select="$width"/></xsl:message> *-->
|
374
|
+
|
375
|
+
<xsl:text><</xsl:text>
|
376
|
+
<xsl:value-of select="name()"/>
|
377
|
+
<xsl:apply-templates select="@*" mode="echo-xml">
|
378
|
+
<xsl:with-param name="break-or-nobreak">
|
379
|
+
<xsl:choose>
|
380
|
+
<xsl:when test="$width > $line-wrap-length">break</xsl:when>
|
381
|
+
<xsl:otherwise>nobreak</xsl:otherwise>
|
382
|
+
</xsl:choose>
|
383
|
+
</xsl:with-param>
|
384
|
+
<xsl:with-param name="s0">
|
385
|
+
<xsl:call-template name="lastline-suffix">
|
386
|
+
<xsl:with-param name="s0" select="preceding-sibling::text()
|
387
|
+
[string-length(.) > 0][1]" />
|
388
|
+
</xsl:call-template>
|
389
|
+
</xsl:with-param>
|
390
|
+
</xsl:apply-templates>
|
391
|
+
<xsl:choose>
|
392
|
+
<xsl:when test="child::node()">
|
393
|
+
<xsl:text>></xsl:text>
|
394
|
+
<xsl:apply-templates select="node()" mode="echo-xml"/>
|
395
|
+
<xsl:text></</xsl:text>
|
396
|
+
<xsl:value-of select="name()"/>
|
397
|
+
<xsl:text>></xsl:text>
|
398
|
+
</xsl:when>
|
399
|
+
<xsl:otherwise>/></xsl:otherwise>
|
400
|
+
</xsl:choose>
|
401
|
+
<!--* </xsl:element> *-->
|
402
|
+
</xsl:template>
|
403
|
+
|
404
|
+
<xsl:template match="xsd:annotation" mode="echo-xml"/>
|
405
|
+
<xsl:template match="@xml:space" mode="echo-xml"/>
|
406
|
+
|
407
|
+
<xsl:template match="@*" mode="echo-xml">
|
408
|
+
<xsl:param name="break-or-nobreak">nobreak</xsl:param>
|
409
|
+
<xsl:param name="s0"></xsl:param>
|
410
|
+
<xsl:variable name="indent">
|
411
|
+
<xsl:choose>
|
412
|
+
<xsl:when test="normalize-space($s0) = ''">
|
413
|
+
<xsl:value-of select="concat($additional-indent,$s0)"/>
|
414
|
+
</xsl:when>
|
415
|
+
<xsl:otherwise>
|
416
|
+
<xsl:value-of select="' '"/>
|
417
|
+
</xsl:otherwise>
|
418
|
+
</xsl:choose>
|
419
|
+
</xsl:variable>
|
420
|
+
|
421
|
+
<xsl:choose>
|
422
|
+
<xsl:when test="parent::xsd:* and $break-or-nobreak = 'break'">
|
423
|
+
<xsl:text>
</xsl:text>
|
424
|
+
<xsl:value-of select="$indent"/>
|
425
|
+
</xsl:when>
|
426
|
+
<xsl:otherwise>
|
427
|
+
<xsl:text> </xsl:text>
|
428
|
+
</xsl:otherwise>
|
429
|
+
</xsl:choose>
|
430
|
+
<xsl:value-of select="name()"/>
|
431
|
+
<xsl:text>="</xsl:text>
|
432
|
+
<xsl:choose>
|
433
|
+
<xsl:when test="parent::xsd:element
|
434
|
+
and namespace-uri() = ''
|
435
|
+
and local-name() = 'ref'
|
436
|
+
">
|
437
|
+
<xsl:call-template name="makelink-maybe"/>
|
438
|
+
</xsl:when>
|
439
|
+
<xsl:when test="parent::xsd:attribute
|
440
|
+
and namespace-uri() = ''
|
441
|
+
and local-name() = 'ref'
|
442
|
+
">
|
443
|
+
<xsl:call-template name="makelink-maybe"/>
|
444
|
+
</xsl:when>
|
445
|
+
<xsl:when test="parent::xsd:restriction
|
446
|
+
and namespace-uri() = ''
|
447
|
+
and local-name() = 'base'
|
448
|
+
">
|
449
|
+
<xsl:call-template name="makelink-maybe"/>
|
450
|
+
</xsl:when>
|
451
|
+
<xsl:when test="parent::xsd:extension
|
452
|
+
and namespace-uri() = ''
|
453
|
+
and local-name() = 'base'
|
454
|
+
">
|
455
|
+
<xsl:call-template name="makelink-maybe"/>
|
456
|
+
</xsl:when>
|
457
|
+
<xsl:when test="parent::xsd:group
|
458
|
+
and namespace-uri() = ''
|
459
|
+
and local-name() = 'ref'
|
460
|
+
">
|
461
|
+
<xsl:call-template name="makelink-maybe"/>
|
462
|
+
</xsl:when>
|
463
|
+
<xsl:when test="parent::xsd:list
|
464
|
+
and namespace-uri() = ''
|
465
|
+
and local-name() = 'itemType'
|
466
|
+
">
|
467
|
+
<xsl:call-template name="makelink-maybe"/>
|
468
|
+
</xsl:when>
|
469
|
+
<xsl:when test="parent::xsd:union
|
470
|
+
and namespace-uri() = ''
|
471
|
+
and local-name() = 'memberTypes'
|
472
|
+
">
|
473
|
+
<xsl:call-template name="makelink-several-maybe"/>
|
474
|
+
</xsl:when>
|
475
|
+
<xsl:when test="parent::xsd:element
|
476
|
+
and namespace-uri() = ''
|
477
|
+
and local-name() = 'type'
|
478
|
+
">
|
479
|
+
<xsl:call-template name="makelink-maybe"/>
|
480
|
+
</xsl:when>
|
481
|
+
<xsl:when test="parent::xsd:attribute
|
482
|
+
and namespace-uri() = ''
|
483
|
+
and local-name() = 'type'
|
484
|
+
">
|
485
|
+
<xsl:call-template name="makelink-maybe"/>
|
486
|
+
</xsl:when>
|
487
|
+
<xsl:when test="parent::xsd:element
|
488
|
+
and namespace-uri() = ''
|
489
|
+
and local-name() = 'substitutionGroup'
|
490
|
+
">
|
491
|
+
<xsl:call-template name="makelink-several-maybe"/>
|
492
|
+
</xsl:when>
|
493
|
+
|
494
|
+
<xsl:otherwise>
|
495
|
+
<xsl:value-of select="."/>
|
496
|
+
</xsl:otherwise>
|
497
|
+
</xsl:choose>
|
498
|
+
<xsl:text>"</xsl:text>
|
499
|
+
|
500
|
+
</xsl:template>
|
501
|
+
<xsl:template match="text()" mode="echo-xml">
|
502
|
+
<xsl:value-of select="."/>
|
503
|
+
</xsl:template>
|
504
|
+
|
505
|
+
|
506
|
+
<!--* 6 toc *-->
|
507
|
+
<xsl:template mode="toc" match="
|
508
|
+
xsd:schema/xsd:annotation
|
509
|
+
| xsd:schema/xsd:attribute
|
510
|
+
| xsd:schema/xsd:element
|
511
|
+
| xsd:schema/xsd:simpleType
|
512
|
+
| xsd:schema/xsd:complexType
|
513
|
+
| xsd:schema/xsd:attributeGroup
|
514
|
+
| xsd:schema/xsd:import
|
515
|
+
| xsd:schema/xsd:group
|
516
|
+
| xsd:schema/xsd:notation
|
517
|
+
">
|
518
|
+
<xsl:call-template name="toc-entry"/>
|
519
|
+
</xsl:template>
|
520
|
+
|
521
|
+
<xsl:template name="toc-entry">
|
522
|
+
<xsl:variable name="sort">
|
523
|
+
<xsl:call-template name="sort"/>
|
524
|
+
</xsl:variable>
|
525
|
+
<xsl:variable name="leid">
|
526
|
+
<xsl:call-template name="leid"/>
|
527
|
+
</xsl:variable>
|
528
|
+
<xsl:element name="li">
|
529
|
+
<xsl:element name="a">
|
530
|
+
<xsl:attribute name="href">
|
531
|
+
<xsl:value-of select="concat('#',$leid)"/>
|
532
|
+
</xsl:attribute>
|
533
|
+
<xsl:choose>
|
534
|
+
<xsl:when test="self::xsd:annotation
|
535
|
+
and
|
536
|
+
( descendant::xhtml:h1 or descendant::xhtml:h2 or descendant::xhtml:h3
|
537
|
+
or descendant::h1 or descendant::h2 or descendant::h3)
|
538
|
+
">
|
539
|
+
<xsl:choose>
|
540
|
+
<xsl:when test="descendant::xhtml:h1">
|
541
|
+
<xsl:value-of select="descendant::xhtml:h1[1]"/>
|
542
|
+
</xsl:when>
|
543
|
+
<xsl:when test="descendant::h1">
|
544
|
+
<xsl:value-of select="descendant::h1[1]"/>
|
545
|
+
</xsl:when>
|
546
|
+
<xsl:when test="descendant::xhtml:h2">
|
547
|
+
<xsl:value-of select="descendant::xhtml:h2[1]"/>
|
548
|
+
</xsl:when>
|
549
|
+
<xsl:when test="descendant::h2">
|
550
|
+
<xsl:value-of select="descendant::h2[1]"/>
|
551
|
+
</xsl:when>
|
552
|
+
<xsl:when test="descendant::xhtml:h3">
|
553
|
+
<xsl:value-of select="descendant::xhtml:h3[1]"/>
|
554
|
+
</xsl:when>
|
555
|
+
<xsl:when test="descendant::h3">
|
556
|
+
<xsl:value-of select="descendant::h3[1]"/>
|
557
|
+
</xsl:when>
|
558
|
+
</xsl:choose>
|
559
|
+
|
560
|
+
</xsl:when>
|
561
|
+
<xsl:otherwise>
|
562
|
+
<xsl:value-of select="concat($sort,' ')"/>
|
563
|
+
<xsl:choose>
|
564
|
+
<xsl:when test="count(@name) = 1">
|
565
|
+
<xsl:element name="em">
|
566
|
+
<xsl:value-of select="@name"/>
|
567
|
+
</xsl:element>
|
568
|
+
</xsl:when>
|
569
|
+
<xsl:when test="self::xsd:annotation">
|
570
|
+
<xsl:value-of select="1 + count(preceding-sibling::xsd:annotation)"/>
|
571
|
+
</xsl:when>
|
572
|
+
<xsl:when test="self::xsd:import">
|
573
|
+
<xsl:element name="code">
|
574
|
+
<xsl:value-of select="@namespace"/>
|
575
|
+
</xsl:element>
|
576
|
+
</xsl:when>
|
577
|
+
<xsl:otherwise>
|
578
|
+
<!--* fake it *-->
|
579
|
+
<xsl:variable name="gi" select="local-name()"/>
|
580
|
+
<xsl:value-of select="1 + count(preceding-sibling::*[local-name() = $gi])"/>
|
581
|
+
</xsl:otherwise>
|
582
|
+
</xsl:choose>
|
583
|
+
</xsl:otherwise>
|
584
|
+
</xsl:choose>
|
585
|
+
</xsl:element>
|
586
|
+
</xsl:element>
|
587
|
+
|
588
|
+
</xsl:template>
|
589
|
+
|
590
|
+
<!--* 7 common code for calculating sort and little-endian IDs *-->
|
591
|
+
<xsl:template name="sort">
|
592
|
+
<xsl:choose>
|
593
|
+
<xsl:when test="self::xsd:annotation">
|
594
|
+
<xsl:value-of select="'Annotation'"/>
|
595
|
+
</xsl:when>
|
596
|
+
<xsl:when test="self::xsd:attribute">
|
597
|
+
<xsl:value-of select="'Attribute'"/>
|
598
|
+
</xsl:when>
|
599
|
+
<xsl:when test="self::xsd:element">
|
600
|
+
<xsl:value-of select="'Element'"/>
|
601
|
+
</xsl:when>
|
602
|
+
<xsl:when test="self::xsd:simpleType">
|
603
|
+
<xsl:value-of select="'Simple type'"/>
|
604
|
+
</xsl:when>
|
605
|
+
<xsl:when test="self::xsd:complexType">
|
606
|
+
<xsl:value-of select="'Complex type'"/>
|
607
|
+
</xsl:when>
|
608
|
+
<xsl:when test="self::xsd:attributeGroup">
|
609
|
+
<xsl:value-of select="'Attribute group'"/>
|
610
|
+
</xsl:when>
|
611
|
+
<xsl:when test="self::xsd:group">
|
612
|
+
<xsl:value-of select="'Model group'"/>
|
613
|
+
</xsl:when>
|
614
|
+
<xsl:otherwise>
|
615
|
+
<xsl:variable name="gi" select="local-name()"/>
|
616
|
+
<xsl:value-of select="concat(
|
617
|
+
translate(substring($gi,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'),
|
618
|
+
substring($gi,2)
|
619
|
+
)"/>
|
620
|
+
</xsl:otherwise>
|
621
|
+
</xsl:choose>
|
622
|
+
</xsl:template>
|
623
|
+
<xsl:template name="leid">
|
624
|
+
<xsl:choose>
|
625
|
+
<xsl:when test="self::xsd:annotation">
|
626
|
+
<xsl:value-of select="concat('ann_',
|
627
|
+
string(1+count(preceding-sibling::xsd:annotation)))"/>
|
628
|
+
</xsl:when>
|
629
|
+
<xsl:when test="self::xsd:attribute">
|
630
|
+
<xsl:value-of select="concat('att_',@name)"/>
|
631
|
+
</xsl:when>
|
632
|
+
<xsl:when test="self::xsd:element">
|
633
|
+
<xsl:value-of select="concat('elem_',@name)"/>
|
634
|
+
</xsl:when>
|
635
|
+
<xsl:when test="self::xsd:simpleType">
|
636
|
+
<xsl:value-of select="concat('type_',@name)"/>
|
637
|
+
</xsl:when>
|
638
|
+
<xsl:when test="self::xsd:complexType">
|
639
|
+
<xsl:value-of select="concat('type_',@name)"/>
|
640
|
+
</xsl:when>
|
641
|
+
<xsl:when test="self::xsd:attributeGroup">
|
642
|
+
<xsl:value-of select="concat('attgrp_',@name)"/>
|
643
|
+
</xsl:when>
|
644
|
+
<xsl:when test="self::xsd:group">
|
645
|
+
<xsl:value-of select="concat('grp_',@name)"/>
|
646
|
+
</xsl:when>
|
647
|
+
<xsl:when test="self::xsd:import">
|
648
|
+
<xsl:value-of select="concat('imp_',
|
649
|
+
string(1+count(preceding-sibling::xsd:import)))"/>
|
650
|
+
</xsl:when>
|
651
|
+
<xsl:otherwise>
|
652
|
+
<xsl:choose>
|
653
|
+
<xsl:when test="@name">
|
654
|
+
<xsl:variable name="sort" select="local-name()"/>
|
655
|
+
<xsl:value-of select="concat($sort,'_',@name)"/>
|
656
|
+
</xsl:when>
|
657
|
+
<xsl:otherwise>
|
658
|
+
<xsl:variable name="sort" select="local-name()"/>
|
659
|
+
<xsl:variable name="pos" select="1 + count(preceding-sibling::*[local-name() = $sort])"/>
|
660
|
+
<xsl:value-of select="concat($sort,'_',$pos)"/>
|
661
|
+
</xsl:otherwise>
|
662
|
+
</xsl:choose>
|
663
|
+
</xsl:otherwise>
|
664
|
+
</xsl:choose>
|
665
|
+
</xsl:template>
|
666
|
+
|
667
|
+
<!--* 8 unmatched elements (mostly diagnostic for development) *-->
|
668
|
+
<xsl:template match="*|@*">
|
669
|
+
<xsl:variable name="fqgi">
|
670
|
+
<xsl:call-template name="fqgi"/>
|
671
|
+
</xsl:variable>
|
672
|
+
<xsl:message>Warning: <xsl:value-of select="$fqgi"/> not matched.</xsl:message>
|
673
|
+
<xsl:element name="div">
|
674
|
+
<xsl:attribute name="class">warning</xsl:attribute>
|
675
|
+
<xsl:value-of select="concat('<',name(),'>')"/>
|
676
|
+
<xsl:copy>
|
677
|
+
<xsl:apply-templates select="@*|node()"/>
|
678
|
+
</xsl:copy>
|
679
|
+
<xsl:value-of select="concat('</',name(),'>')"/>
|
680
|
+
</xsl:element>
|
681
|
+
</xsl:template>
|
682
|
+
|
683
|
+
<xsl:template name="fqgi" match="*" mode="fqgi">
|
684
|
+
<xsl:param name="sBuf"/>
|
685
|
+
<xsl:variable name="sCur">
|
686
|
+
<xsl:choose>
|
687
|
+
<xsl:when test="self::*">
|
688
|
+
<!--* elements *-->
|
689
|
+
<xsl:value-of select="name()"/>
|
690
|
+
</xsl:when>
|
691
|
+
<xsl:otherwise>
|
692
|
+
<!--* attributes and other riffraff *-->
|
693
|
+
<xsl:value-of select="concat('@',name())"/>
|
694
|
+
</xsl:otherwise>
|
695
|
+
</xsl:choose>
|
696
|
+
</xsl:variable>
|
697
|
+
<!--*
|
698
|
+
<xsl:message>FQGI(<xsl:value-of select="concat($sBuf,',',$sCur)"/>)</xsl:message>
|
699
|
+
*-->
|
700
|
+
<xsl:choose>
|
701
|
+
<xsl:when test="parent::*">
|
702
|
+
<xsl:apply-templates mode="fqgi" select="parent::*">
|
703
|
+
<xsl:with-param name="sBuf">
|
704
|
+
<xsl:value-of select="concat('/',$sCur,$sBuf)"/>
|
705
|
+
</xsl:with-param>
|
706
|
+
</xsl:apply-templates>
|
707
|
+
</xsl:when>
|
708
|
+
<xsl:otherwise>
|
709
|
+
<xsl:value-of select="concat('/',$sCur,$sBuf)"/>
|
710
|
+
</xsl:otherwise>
|
711
|
+
</xsl:choose>
|
712
|
+
</xsl:template>
|
713
|
+
|
714
|
+
|
715
|
+
<!--* 9 intra-document link calculation, qname manipulation *-->
|
716
|
+
<xsl:template name="makelink-several-maybe">
|
717
|
+
<xsl:param name="lQNames" select="normalize-space(.)"/>
|
718
|
+
<xsl:choose>
|
719
|
+
<xsl:when test="contains($lQNames,' ')">
|
720
|
+
<!--* recur *-->
|
721
|
+
<xsl:call-template name="makelink-maybe">
|
722
|
+
<xsl:with-param name="qn" select="substring-before($lQNames,' ')"/>
|
723
|
+
</xsl:call-template>
|
724
|
+
<xsl:text> </xsl:text>
|
725
|
+
<xsl:call-template name="makelink-several-maybe">
|
726
|
+
<xsl:with-param name="lQNames" select="substring-after($lQNames,' ')"/>
|
727
|
+
</xsl:call-template>
|
728
|
+
</xsl:when>
|
729
|
+
<xsl:otherwise>
|
730
|
+
<!--* base step, no blank so at most one QName *-->
|
731
|
+
<xsl:call-template name="makelink-maybe">
|
732
|
+
<xsl:with-param name="qn" select="$lQNames"/>
|
733
|
+
</xsl:call-template>
|
734
|
+
</xsl:otherwise>
|
735
|
+
</xsl:choose>
|
736
|
+
</xsl:template>
|
737
|
+
|
738
|
+
<xsl:template name="makelink-maybe">
|
739
|
+
<xsl:param name="qn" select="."/>
|
740
|
+
<xsl:param name="refns">
|
741
|
+
<xsl:call-template name="qname-to-uri">
|
742
|
+
<xsl:with-param name="qname" select="$qn"/>
|
743
|
+
</xsl:call-template>
|
744
|
+
</xsl:param>
|
745
|
+
<xsl:param name="lname">
|
746
|
+
<xsl:call-template name="qname-to-ncname">
|
747
|
+
<xsl:with-param name="qname" select="$qn"/>
|
748
|
+
</xsl:call-template>
|
749
|
+
</xsl:param>
|
750
|
+
|
751
|
+
<xsl:variable name="linktarget">
|
752
|
+
<xsl:choose>
|
753
|
+
<xsl:when test="$tns = $refns">
|
754
|
+
<xsl:choose>
|
755
|
+
<xsl:when test="parent::xsd:element
|
756
|
+
and local-name() = 'ref'
|
757
|
+
and count(/xsd:schema/xsd:element[@name = $lname]) = 1">
|
758
|
+
<xsl:value-of select="concat('elem_',$lname)"/>
|
759
|
+
</xsl:when>
|
760
|
+
<xsl:when test="parent::xsd:element
|
761
|
+
and local-name() = 'substitutionGroup'
|
762
|
+
and count(/xsd:schema/xsd:element[@name = $lname]) = 1">
|
763
|
+
<xsl:value-of select="concat('elem_',$lname)"/>
|
764
|
+
</xsl:when>
|
765
|
+
<xsl:when test="parent::xsd:attribute
|
766
|
+
and local-name() = 'ref'
|
767
|
+
and count(/xsd:schema/xsd:attribute[@name = $lname]) = 1">
|
768
|
+
<xsl:value-of select="concat('att_',$lname)"/>
|
769
|
+
</xsl:when>
|
770
|
+
<xsl:when test="parent::xsd:restriction
|
771
|
+
and count(/xsd:schema/xsd:*[@name = $lname
|
772
|
+
and (self::xsd:simpleType or self::xsd:complexType)])
|
773
|
+
= 1">
|
774
|
+
<xsl:value-of select="concat('type_',$lname)"/>
|
775
|
+
</xsl:when>
|
776
|
+
<xsl:when test="parent::xsd:extension
|
777
|
+
and count(/xsd:schema/xsd:*[@name = $lname
|
778
|
+
and (self::xsd:simpleType or self::xsd:complexType)])
|
779
|
+
= 1">
|
780
|
+
<xsl:value-of select="concat('type_',$lname)"/>
|
781
|
+
</xsl:when>
|
782
|
+
<xsl:when test="parent::xsd:element
|
783
|
+
and local-name() = 'type'
|
784
|
+
and count(/xsd:schema/xsd:*[@name = $lname
|
785
|
+
and (self::xsd:simpleType or self::xsd:complexType)])
|
786
|
+
= 1">
|
787
|
+
<xsl:value-of select="concat('type_',$lname)"/>
|
788
|
+
</xsl:when>
|
789
|
+
<xsl:when test="parent::xsd:attribute
|
790
|
+
and local-name() = 'type'
|
791
|
+
and count(/xsd:schema/xsd:*[@name = $lname
|
792
|
+
and (self::xsd:simpleType or self::xsd:complexType)])
|
793
|
+
= 1">
|
794
|
+
<xsl:value-of select="concat('type_',$lname)"/>
|
795
|
+
</xsl:when>
|
796
|
+
<xsl:when test="parent::xsd:list
|
797
|
+
and count(/xsd:schema/xsd:*[@name = $lname
|
798
|
+
and (self::xsd:simpleType or self::xsd:complexType)])
|
799
|
+
= 1">
|
800
|
+
<xsl:value-of select="concat('type_',$lname)"/>
|
801
|
+
</xsl:when>
|
802
|
+
<xsl:when test="parent::xsd:union
|
803
|
+
and count(/xsd:schema/xsd:*[@name = $lname
|
804
|
+
and (self::xsd:simpleType or self::xsd:complexType)])
|
805
|
+
= 1">
|
806
|
+
<xsl:value-of select="concat('type_',$lname)"/>
|
807
|
+
</xsl:when>
|
808
|
+
<xsl:when test="parent::xsd:group
|
809
|
+
and count(/xsd:schema/xsd:group[@name = $lname]) = 1">
|
810
|
+
<xsl:value-of select="concat('grp_',$lname)"/>
|
811
|
+
</xsl:when>
|
812
|
+
<xsl:when test="parent::xsd:attributeGroup
|
813
|
+
and count(/xsd:schema/xsd:atributeGroup[@name = $lname]) = 1">
|
814
|
+
<xsl:value-of select="concat('attgrp_',$lname)"/>
|
815
|
+
</xsl:when>
|
816
|
+
<!--* static links to built-ins could be handled here *-->
|
817
|
+
</xsl:choose>
|
818
|
+
</xsl:when>
|
819
|
+
<xsl:when test="count(ancestor::*/namespace::*) = 0">
|
820
|
+
<!--* we are either in a no-namespace document in Opera,
|
821
|
+
* or we are in Firefox, without ns support.
|
822
|
+
*-->
|
823
|
+
<xsl:value-of select="'no-ns-support'"/>
|
824
|
+
</xsl:when>
|
825
|
+
<xsl:otherwise>
|
826
|
+
<!--* namespaces did not match, no target *-->
|
827
|
+
<xsl:value-of select="'no-target'"/>
|
828
|
+
</xsl:otherwise>
|
829
|
+
</xsl:choose>
|
830
|
+
</xsl:variable>
|
831
|
+
|
832
|
+
<xsl:choose>
|
833
|
+
<xsl:when test="($linktarget='no-ns-support')">
|
834
|
+
<xsl:value-of select="$qn"/>
|
835
|
+
</xsl:when>
|
836
|
+
<xsl:when test="($linktarget='no-target' or $linktarget='')
|
837
|
+
and ($tns = $refns)">
|
838
|
+
<xsl:element name="span">
|
839
|
+
<xsl:attribute name="class">external-link same-ns</xsl:attribute>
|
840
|
+
<xsl:value-of select="$qn"/>
|
841
|
+
</xsl:element>
|
842
|
+
</xsl:when>
|
843
|
+
<xsl:when test="($linktarget='no-target')
|
844
|
+
and not($tns = $refns)">
|
845
|
+
<xsl:element name="span">
|
846
|
+
<xsl:attribute name="class">external-link diff-ns</xsl:attribute>
|
847
|
+
<xsl:value-of select="$qn"/>
|
848
|
+
</xsl:element>
|
849
|
+
</xsl:when>
|
850
|
+
<xsl:otherwise>
|
851
|
+
<xsl:element name="a">
|
852
|
+
<xsl:attribute name="href">
|
853
|
+
<xsl:value-of select="concat('#',$linktarget)"/>
|
854
|
+
</xsl:attribute>
|
855
|
+
<xsl:value-of select="$qn"/>
|
856
|
+
</xsl:element>
|
857
|
+
</xsl:otherwise>
|
858
|
+
</xsl:choose>
|
859
|
+
</xsl:template>
|
860
|
+
|
861
|
+
<xsl:template name="qname-to-uri" match="*" mode="qname-to-uri">
|
862
|
+
<xsl:param name="qname" select="."/>
|
863
|
+
<xsl:variable name="prefix" select="substring-before($qname,':')"/>
|
864
|
+
<xsl:choose>
|
865
|
+
<xsl:when test="(1=1) and ($prefix='xml')">
|
866
|
+
<!--* we need to special-case 'xml', since
|
867
|
+
* Opera does not provide a ns node for it.
|
868
|
+
*-->
|
869
|
+
<xsl:value-of select="'http://www.w3.org/XML/1998/namespace'"/>
|
870
|
+
</xsl:when>
|
871
|
+
<xsl:when test="self::*">
|
872
|
+
<!--* we're an element *-->
|
873
|
+
<xsl:value-of select="string(namespace::*[name()=$prefix])"/>
|
874
|
+
</xsl:when>
|
875
|
+
<xsl:otherwise>
|
876
|
+
<!--* we're not an element *-->
|
877
|
+
<xsl:value-of select="string(parent::*/namespace::*[name()=$prefix])"/>
|
878
|
+
</xsl:otherwise>
|
879
|
+
</xsl:choose>
|
880
|
+
</xsl:template>
|
881
|
+
<xsl:template name="qname-to-ncname">
|
882
|
+
<xsl:param name="qname" select="."/>
|
883
|
+
<xsl:choose>
|
884
|
+
<xsl:when test="contains($qname,':')">
|
885
|
+
<xsl:value-of select="substring-after($qname,':')"/>
|
886
|
+
</xsl:when>
|
887
|
+
<xsl:otherwise>
|
888
|
+
<xsl:value-of select="$qname"/>
|
889
|
+
</xsl:otherwise>
|
890
|
+
</xsl:choose>
|
891
|
+
</xsl:template>
|
892
|
+
|
893
|
+
<xsl:template name="lastline-suffix">
|
894
|
+
<xsl:param name="s0"></xsl:param>
|
895
|
+
<xsl:choose>
|
896
|
+
<xsl:when test="contains($s0,'
')">
|
897
|
+
<xsl:call-template name="lastline-suffix">
|
898
|
+
<xsl:with-param name="s0" select="substring-after($s0,'
')"/>
|
899
|
+
</xsl:call-template>
|
900
|
+
</xsl:when>
|
901
|
+
<xsl:otherwise>
|
902
|
+
<xsl:value-of select="$s0"/>
|
903
|
+
</xsl:otherwise>
|
904
|
+
</xsl:choose>
|
905
|
+
</xsl:template>
|
906
|
+
|
907
|
+
|
908
|
+
<xsl:template name="stag-width">
|
909
|
+
<xsl:param name="indent-length" select="0"/>
|
910
|
+
|
911
|
+
<xsl:variable name="attcount" select="count(@*)"/>
|
912
|
+
<xsl:variable name="list-attname-lengths">
|
913
|
+
<xsl:call-template name="make-length-list">
|
914
|
+
<xsl:with-param name="kw">attnames</xsl:with-param>
|
915
|
+
</xsl:call-template>
|
916
|
+
</xsl:variable>
|
917
|
+
|
918
|
+
<xsl:variable name="list-attval-lengths">
|
919
|
+
<xsl:call-template name="make-length-list">
|
920
|
+
<xsl:with-param name="kw">attvals</xsl:with-param>
|
921
|
+
</xsl:call-template>
|
922
|
+
</xsl:variable>
|
923
|
+
|
924
|
+
<xsl:variable name="sum-att-lengths">
|
925
|
+
<xsl:call-template name="sum-list">
|
926
|
+
<xsl:with-param name="s0" select="concat($list-attname-lengths,' ',$list-attval-lengths)"/>
|
927
|
+
</xsl:call-template>
|
928
|
+
</xsl:variable>
|
929
|
+
|
930
|
+
<!--*
|
931
|
+
<xsl:message>indent-length = <xsl:value-of select="$indent-length"/></xsl:message>
|
932
|
+
<xsl:message>attcount = <xsl:value-of select="$attcount"/></xsl:message>
|
933
|
+
<xsl:message>sum-att-lengths = <xsl:value-of select="$sum-att-lengths"/></xsl:message>
|
934
|
+
<xsl:message>namelen = <xsl:value-of select="string-length(name())"/></xsl:message>
|
935
|
+
*-->
|
936
|
+
|
937
|
+
<xsl:value-of select="$indent-length + (4 * $attcount) + $sum-att-lengths + string-length(name()) + 3"/>
|
938
|
+
|
939
|
+
</xsl:template>
|
940
|
+
|
941
|
+
|
942
|
+
<xsl:template name="make-length-list">
|
943
|
+
<xsl:param name="kw">unknown</xsl:param>
|
944
|
+
<xsl:choose>
|
945
|
+
<xsl:when test="$kw = 'attnames'">
|
946
|
+
<xsl:apply-templates select="@*" mode="attnamelength"/>
|
947
|
+
</xsl:when>
|
948
|
+
<xsl:when test="$kw = 'attvals'">
|
949
|
+
<xsl:apply-templates select="@*" mode="attvallength"/>
|
950
|
+
</xsl:when>
|
951
|
+
<xsl:otherwise>0</xsl:otherwise>
|
952
|
+
</xsl:choose>
|
953
|
+
</xsl:template>
|
954
|
+
|
955
|
+
<xsl:template name="sum-list">
|
956
|
+
<xsl:param name="n0" select="0"/>
|
957
|
+
<xsl:param name="s0"/>
|
958
|
+
|
959
|
+
<xsl:variable name="s1" select="normalize-space($s0)"/>
|
960
|
+
|
961
|
+
<!--*
|
962
|
+
<xsl:message><xsl:value-of select="concat('n0 =', $n0, ', s1 = /',$s1,'/')"/></xsl:message>
|
963
|
+
*-->
|
964
|
+
|
965
|
+
<xsl:choose>
|
966
|
+
<xsl:when test="contains($s1,' ')">
|
967
|
+
<xsl:variable name="term" select="substring-before($s1,' ')"/>
|
968
|
+
<xsl:variable name="s2" select="substring-after($s1,' ')"/>
|
969
|
+
<xsl:call-template name="sum-list">
|
970
|
+
<xsl:with-param name="n0" select="$n0 + $term"/>
|
971
|
+
<xsl:with-param name="s0" select="$s2"/>
|
972
|
+
</xsl:call-template>
|
973
|
+
</xsl:when>
|
974
|
+
<xsl:otherwise>
|
975
|
+
<xsl:value-of select="$n0 + $s1"/>
|
976
|
+
</xsl:otherwise>
|
977
|
+
</xsl:choose>
|
978
|
+
</xsl:template>
|
979
|
+
|
980
|
+
<xsl:template match="@*" mode="attnamelength">
|
981
|
+
<xsl:value-of select="concat(string-length(name()), ' ')"/>
|
982
|
+
</xsl:template>
|
983
|
+
<xsl:template match="@*" mode="attvallength">
|
984
|
+
<xsl:value-of select="concat(string-length(.), ' ')"/>
|
985
|
+
</xsl:template>
|
986
|
+
|
987
|
+
</xsl:stylesheet>
|
988
|
+
<!-- Keep this comment at the end of the file
|
989
|
+
Local variables:
|
990
|
+
mode: xml
|
991
|
+
sgml-default-dtd-file:"/Library/SGML/Public/Emacs/xslt.ced"
|
992
|
+
sgml-omittag:t
|
993
|
+
sgml-shorttag:t
|
994
|
+
sgml-indent-data:t
|
995
|
+
sgml-indent-step:1
|
996
|
+
End:
|
997
|
+
-->
|