1 <?xml version='
1.0'
encoding=
"UTF-8"?>
2 <xsl:stylesheet version=
"1.0"
4 xmlns=
"http://docbook.org/ns/docbook"
5 xmlns:
db=
"http://docbook.org/ns/docbook"
6 xmlns:
xsl=
"http://www.w3.org/1999/XSL/Transform"
7 xmlns:
xlink=
"http://www.w3.org/1999/xlink"
8 xmlns:
ex=
"http://exslt.org/dates-and-times"
9 xmlns:
em=
"http://exslt.org/math"
10 xmlns:
es=
"http://exslt.org/sets"
11 xmlns:
ec=
"http://exslt.org/common"
12 xmlns:
esets=
"http://exslt.org/sets"
13 xmlns:
p=
"tag:fenglich.fastmail.fm,2007:Pottery">
16 <!-- Do some business logic validation. -->
17 <xsl:template match=
"/">
18 <!-- glazing referencing brushons. -->
19 <xsl:variable name=
"invalidGlazeRef">
20 <xsl:for-each select=
"//p:glazing">
21 <xsl:variable name=
"name" select=
"@idref"/>
22 <xsl:value-of select=
"//p:glaze[@xml:id = $name and @type = 'BrushOn']/@xml:id"/>
26 <xsl:if test=
"string-length(normalize-space($invalidGlazeRef)) > 0">
27 <xsl:message terminate=
"yes"><xsl:value-of select=
"$invalidGlazeRef"/> is referenced as a non-brushon, while it in fact is.
</xsl:message>
30 <!-- brushons referencing non-brushons. -->
31 <xsl:variable name=
"invalidBrushOnGlazeRef">
32 <xsl:for-each select=
"//p:brushon">
33 <xsl:variable name=
"name" select=
"@idref"/>
34 <xsl:value-of select=
"//p:glaze[@xml:id = $name and @type != 'BrushOn']/@xml:id"/>
38 <xsl:if test=
"string-length(normalize-space($invalidBrushOnGlazeRef)) > 0">
39 <xsl:message terminate=
"yes"><xsl:value-of select=
"$invalidBrushOnGlazeRef"/> are referenced as a brushon, while it isn't.
</xsl:message>
42 <xsl:apply-templates/>
45 <xsl:template match=
"p:pottery">
48 <title>The Next Sample
</title>
51 <firstname>Frans
</firstname>
52 <surname>Englich
</surname>
54 <email>fenglich@fastmail.fm
</email>
56 <phone>+
46-
702-
411091</phone>
59 <pubdate><xsl:value-of select=
"ex:date()"/></pubdate>
61 <para>Copyright (c)
2007-
2008 Frans Englich
</para>
62 <para>Permission is granted to copy, distribute and/or modify this document
63 under the terms of the GNU Free Documentation License, Version
1.2
64 or any later version published by the Free Software Foundation;
65 with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
66 Texts. A copy of the license can be obtained at the
<phrase xlink:
href=
"http://www.gnu.org/licenses/fdl.html">Free Software Foundation's website
</phrase> or by contacting the author.
</para>
70 <xsl:apply-templates select=
"p:pieces"/>
71 <xsl:apply-templates select=
"p:glazes"/>
73 <chapter xml:
id=
"NonGlazeSamples">
74 <title>Non-glaze Samples
</title>
75 <para>This section contains samples which aren't of glazes,
76 such as melt tests. See also the samples that have at least
77 <phrase xlink:
href=
"#Transparent">transparent
78 glaze
</phrase> as glazing, which contains similar kind
81 <xsl:apply-templates select=
"p:samples/p:sample[not(p:glazing | p:brushon)]"/>
84 <chapter xml:
id=
"OvenPrograms">
85 <title>Oven Programs
</title>
87 <para>Unless otherwise stated, all firings were done with the following settings.
</para>
92 <entry>Program Code
</entry>
106 <entry>Bisque
</entry>
117 <entry>Decal
& Luster
</entry>
128 <entry>Unused Bisque Program
</entry>
154 <xsl:apply-templates select=
"p:clays"/>
156 <xsl:call-template name=
"sourcesAppendix"/>
160 <xsl:template match=
"p:pieces">
161 <chapter xml:
id=
"Pieces">
162 <title>Pieces
</title>
164 <para>A total of
<xsl:value-of select=
"count(p:piece)"/> pieces.
</para>
166 <para>The IDs assigned to pieces are arbitrary and not sequential. They don't reflect cronologically
167 the creation. However, they are sorted numerically in this document for quick lookup.
</para>
169 <xsl:apply-templates select=
"p:piece">
170 <xsl:sort data-type=
"number" select=
"number(substring(@xml:id, 2))"/>
171 </xsl:apply-templates>
175 <xsl:template match=
"p:piece">
177 <xsl:attribute name=
"xml:id"><xsl:value-of select=
"@xml:id"/></xsl:attribute>
178 <xsl:attribute name=
"xreflabel"><xsl:value-of select=
"@xml:id"/></xsl:attribute>
180 <xsl:value-of select=
"substring(@xml:id, 2)"/>
182 <xsl:apply-templates/>
183 <xsl:call-template name=
"createReferences"/>
187 <xsl:template match=
"p:clayref">
189 <emphasis>Clay
</emphasis>:
<phrase xlink:
href=
"#{@idref}">
190 <xsl:value-of select=
"/p:pottery/p:clays/p:clay[@xml:id = current()/@idref]/@name"/></phrase>
191 <xsl:apply-templates select=
"@weightWhenWet"/>
196 <xsl:template match=
"@weightWhenWet">
197 <xsl:text>, weight
</xsl:text>
198 <emphasis>when wet
</emphasis>:
199 <constant><xsl:value-of select=
"."/></constant> g
202 <xsl:template match=
"p:note">
204 <title><xsl:value-of select=
"@date"/></title>
205 <para><xsl:value-of select=
"."/></para>
209 <xsl:template match=
"p:glazes">
210 <chapter xml:
id=
"Glazes">
211 <title>Glazes by Color
</title>
213 <para>A total of
<xsl:value-of select=
"count(//p:sample)"/> sample tiles.
</para>
215 <xsl:for-each select=
"esets:distinct(p:glaze/@category)">
216 <xsl:sort select=
"."/>
219 <xsl:attribute name=
"xml:id"><xsl:value-of select=
"."/></xsl:attribute>
220 <title><xsl:value-of select=
"."/></title>
221 <xsl:apply-templates select=
"(/)//p:glaze[@category = current()]">
222 <xsl:sort select=
"@name"/>
223 </xsl:apply-templates>
229 <xsl:template match=
"p:glaze">
231 <xsl:attribute name=
"xml:id"><xsl:value-of select=
"@xml:id"/></xsl:attribute>
232 <xsl:attribute name=
"xreflabel"><xsl:value-of select=
"@name"/></xsl:attribute>
234 <xsl:value-of select=
"@name"/>
235 <xsl:if test=
"@productID">,
236 <xsl:value-of select=
"@productID"/>
238 <xsl:if test=
"@type = 'BrushOn'"> (brush-on)
</xsl:if>
241 <xsl:apply-templates select=
"@manufacturer"/>
242 <xsl:apply-templates select=
"db:para"/>
244 <xsl:apply-templates select=
"p:recipe"/>
246 <xsl:call-template name=
"createReferences"/>
248 <xsl:variable name=
"piecesUsing" select=
"//p:pieces/p:piece[p:glazing/@idref = current()/@xml:id]/@xml:id"/>
249 <xsl:if test=
"$piecesUsing">
252 <xsl:when test=
"count($piecesUsing) > 1">pieces
</xsl:when>
253 <xsl:otherwise>piece
</xsl:otherwise>
256 <xsl:text> </xsl:text>
258 <xsl:call-template name=
"listItems">
259 <xsl:with-param name=
"items" select=
"$piecesUsing"/>
265 <xsl:variable name=
"secondaryTiles" select=
"//p:samples/p:sample[(p:brushon | p:glazing)[position() > 1][@idref = current()/@xml:id]]/@xml:id"/>
267 <xsl:if test=
"$secondaryTiles">
268 <para>Appears as a secondary glaze on
270 <xsl:when test=
"count($piecesUsing) > 1">tiles
</xsl:when>
271 <xsl:otherwise>tile
</xsl:otherwise>
274 <xsl:text> </xsl:text>
276 <xsl:call-template name=
"listItems">
277 <xsl:with-param name=
"items" select=
"$secondaryTiles"/>
282 <xsl:variable name=
"tiles" select=
"//p:samples/p:sample[(p:brushon | p:glazing)[1][@idref = current()/@xml:id]]"/>
283 <xsl:apply-templates select=
"$tiles">
284 <!-- TODO This just doesn't seem to work. -->
285 <xsl:sort data-type=
"number" select=
"number(substring(@xml:id, 2))"/>
286 <!--<xsl:sort data-type="number" select="number(p:glazing/@hydrometerGravity)"/>-->
287 <xsl:with-param name=
"mainGlaze" select=
"@xml:id"/>
288 </xsl:apply-templates>
292 <xsl:template match=
"p:glaze/@manufacturer">
293 <db:para>From:
<xsl:value-of select=
"."/>.
</db:para>
296 <xsl:template name=
"listItems">
297 <xsl:param name=
"items"/>
299 <xsl:for-each select=
"$items">
300 <xsl:sort select=
"."/>
301 <db:xref xlink:
href=
"#{.}"/>
302 <xsl:if test=
"position() = last() - 1">
303 <xsl:text> and
</xsl:text>
305 <xsl:if test=
"position() < last() - 1">
306 <xsl:text>,
</xsl:text>
308 <xsl:if test=
"position() = last()">
309 <xsl:text>.
</xsl:text>
314 <xsl:template match=
"p:piece/p:image">
317 <imagedata align=
"right" format=
"JPG" fileref=
"../Images/Pieces/{../@xml:id}/{.}.jpg"/>
322 <xsl:template match=
"p:sample">
323 <xsl:param name=
"mainGlaze"/>
325 <xsl:attribute name=
"xml:id"><xsl:value-of select=
"@xml:id"/></xsl:attribute>
326 <xsl:attribute name=
"xreflabel"><xsl:value-of select=
"@xml:id"/></xsl:attribute>
327 <title><xsl:value-of select=
"@xml:id"/></title>
329 <para><date><xsl:value-of select=
"@date"/></date></para>
331 <xsl:apply-templates select=
"(p:glazing | p:brushon)[@idref = $mainGlaze]" mode=
"lowKeyGlazing"/>
333 <xsl:variable name=
"additionalGlazes" select=
"(p:brushon | p:glazing)[@idref != $mainGlaze]"/>
334 <xsl:if test=
"(p:brushon | p:glazing)[@idref != $mainGlaze]">
335 <para>Additional glaze
<xsl:if test=
"count($additionalGlazes) > 1">s
</xsl:if>:
</para>
336 <xsl:apply-templates select=
"(p:brushon | p:glazing)[@idref != $mainGlaze]"/>
338 <xsl:apply-templates select=
"p:clayref"/>
340 <xsl:call-template name=
"createReferences"/>
342 <xsl:apply-templates select=
"db:para"/>
343 <xsl:apply-templates mode=
"doImage" select=
"."/>
347 <xsl:template name=
"createReferences">
348 <xsl:variable name=
"id" select=
"@xml:id"/>
349 <xsl:variable name=
"referencedFrom" select=
"(/)//@xml:id[parent::node()//@xlink:href[substring-after(., '#') = $id]]"/>
351 <xsl:if test=
"$referencedFrom">
353 <xsl:text>Referenced by
</xsl:text>
354 <xsl:call-template name=
"listItems">
355 <xsl:with-param name=
"items" select=
"$referencedFrom"/>
361 <xsl:template mode=
"doImage" match=
"p:sample">
362 <xsl:variable name=
"id" select=
"string(@xml:id)"/>
363 <xsl:copy-of select=
"document('imageMetaData.xml')//db:mediaobject[@xml:id = concat('TileImage_', $id)]"/>
366 <xsl:template match=
"p:sample/p:para">
368 <title><xsl:value-of select=
"../@date"/></title>
370 <xsl:apply-templates select=
"."/>
375 <xsl:template match=
"p:glazing">
376 <para><phrase xlink:
href=
"#{@idref}"><xsl:value-of select=
"/p:pottery/p:glazes/p:glaze[@xml:id = current()/@idref]/@name"/></phrase>,
377 <xsl:apply-templates select=
"." mode=
"lowKeyGlazing"/>
381 <xsl:template match=
"p:brushon">
382 <para><phrase xlink:
href=
"#{@idref}"><xsl:value-of select=
"/p:pottery/p:glazes/p:glaze[@xml:id = current()/@idref]/@name"/></phrase></para>
385 <xsl:template match=
"p:glazing" mode=
"lowKeyGlazing">
387 <xsl:when test=
"@hydrometerGravity">
388 <xsl:apply-templates select=
"@hydrometerGravity"/>
391 <emphasis>hydrometer gravity unknown
</emphasis>,
394 <xsl:apply-templates select=
"@sieved"/>
397 <xsl:template match=
"@hydrometerGravity">
398 <emphasis>hydrometer gravity
</emphasis>
399 <xsl:text> </xsl:text>
400 <constant><xsl:value-of select=
"."/></constant>,
403 <xsl:template match=
"@sieved">
406 <xsl:when test=
". = 'WithMixer'">
409 <xsl:when test=
". = 'no'">
413 sieved with mesh size
<constant><xsl:value-of select=
"."/></constant>
419 <xsl:template name=
"sourcesAppendix">
420 <appendix xml:
id=
"SourceFiles">
421 <title>Sources
</title>
422 <para>This document was generated from the following sources. The string following the file date is the git SHA1 checksum.
</para>
424 <xsl:apply-templates select=
"document('sources.xml')/p:sources/p:source"/>
429 <xsl:template match=
"p:source">
432 <filename><xsl:value-of select=
"@href"/></filename>
433 <xsl:text>,
</xsl:text>
434 <date><xsl:value-of select=
"@date"/></date>
435 <xsl:text>,
</xsl:text>
436 <systemitem><xsl:value-of select=
"@gitSHA1"/></systemitem>
441 <xsl:template match=
"p:clays">
442 <chapter xml:
id=
"Clays">
444 <xsl:apply-templates/>
448 <xsl:template match=
"p:clay">
450 <xsl:attribute name=
"xml:id"><xsl:value-of select=
"@xml:id"/></xsl:attribute>
452 <xsl:value-of select=
"@name"/>
453 <xsl:if test=
"@productID">,
454 <xsl:value-of select=
"@productID"/>
461 <xsl:template match=
"@* | db:* | @xlink:*">
463 <xsl:apply-templates select=
"@*|node()"/>
467 <xsl:template match=
"p:recipe">
470 <xsl:variable name=
"hasReplacement" select=
"p:component/@replacementFor"/>
473 <entry>Component
</entry>
474 <xsl:if test=
"$hasReplacement">
475 <entry>Source/Replacement For
</entry>
478 <entry>Price/kg for
<phrase xlink:
href=
"http://www.we.no/">Waldm. Ellefsen AS
</phrase> 2003, MVA, NOK
</entry>
484 <xsl:if test=
"sum(p:component/@parts) < 100">
485 <xsl:message terminate=
"yes">The components for glaze
<xsl:value-of select=
"../@name"/> amount to less than
100 parts
</xsl:message>
487 <xsl:if test=
"$hasReplacement">
490 <entry><xsl:value-of select=
"sum(p:component/@parts)"/></entry>
492 <xsl:variable name=
"componentPrices">
493 <xsl:apply-templates mode=
"computePrice" select=
"p:component"/>
496 <xsl:value-of select=
"sum(ec:node-set($componentPrices)/*)"/>
501 <xsl:apply-templates select=
"p:component">
502 <xsl:with-param name=
"hasReplacement" select=
"$hasReplacement"/>
503 </xsl:apply-templates>
509 <xsl:template match=
"p:component">
510 <xsl:param name=
"hasReplacement"/>
513 <xsl:variable name=
"component" select=
"/p:pottery/p:components/p:component[@xml:id = current()/@idref]"/>
514 <xsl:call-template name=
"checkComponentRef">
515 <xsl:with-param name=
"component" select=
"$component"/>
516 <xsl:with-param name=
"name" select=
"@idref"/>
518 <entry><xsl:copy-of select=
"$component/node()"/></entry>
519 <xsl:if test=
"@replacementFor">
520 <xsl:variable name=
"replacement" select=
"/p:pottery/p:components/p:component[@xml:id = current()/@replacementFor]"/>
521 <xsl:call-template name=
"checkComponentRef">
522 <xsl:with-param name=
"component" select=
"$replacement"/>
523 <xsl:with-param name=
"name" select=
"@replacementFor"/>
525 <entry><xsl:copy-of select=
"$replacement/node()"/></entry>
528 <xsl:if test=
"$hasReplacement and not(@replacementFor)">
531 <entry><constant><xsl:value-of select=
"@parts"/></constant></entry>
534 <xsl:apply-templates mode=
"computePrice" select=
"."/>
539 <xsl:template mode=
"computePrice" match=
"p:component">
541 <xsl:variable name=
"price" select=
"number(/p:pottery/p:components/p:component[@xml:id = current()/@idref]/@price)"/>
542 <xsl:variable name=
"priceIsFor" select=
"number(/p:pottery/p:components/p:component[@xml:id = current()/@idref]/@priceIsFor)"/>
544 <xsl:value-of select=
"((($price div ($priceIsFor div 1000.0)) * (@parts div 100.0)) * 1.25)"/>
548 <xsl:template match=
"p:measurementsWhenDone">
549 <para>Measurements: height
<constant><xsl:value-of select=
"@height"/></constant> mm,
551 <xsl:if test=
"@width = @depth">
552 <xsl:message>If the depth is the same as the width, the
553 depth shouldn't be specified. Detected for
554 <xsl:value-of select=
"../@xml:id"/></xsl:message>
558 <xsl:when test=
"not(@depth)">
559 diameter
<constant><xsl:value-of select=
"@width"/></constant> mm
562 width
<constant><xsl:value-of select=
"@width"/></constant> mm,
563 depth
<constant><xsl:value-of select=
"@depth"/></constant> mm
569 <xsl:template name=
"checkComponentRef">
570 <xsl:param name=
"component"/>
571 <xsl:param name=
"name"/>
573 <xsl:if test=
"not($component)">
574 <xsl:message terminate=
"yes">Component for reference
<xsl:value-of select=
"$name"/> couldn't be found.
</xsl:message>
578 <!-- We don't use it directly. -->
579 <xsl:template match=
"p:samples"/>
581 <!-- Flag things we miss. -->
582 <xsl:template match=
"* | @*">
583 <xsl:message terminate=
"yes">
584 Unmatched node:
<xsl:value-of select=
"name()"/> <xsl:value-of select=
"string()"/>
591 vim: et:ts=4:sw=4:sts=4