1 <?xml version='
1.0'
encoding=
"UTF-8"?>
2 <!DOCTYPE book SYSTEM
"-//OASIS//DTD DocBook V5.0//EN">
3 <xsl:stylesheet version=
"1.0"
5 xmlns=
"http://docbook.org/ns/docbook"
6 xmlns:
db=
"http://docbook.org/ns/docbook"
7 xmlns:
xsl=
"http://www.w3.org/1999/XSL/Transform"
8 xmlns:
xlink=
"http://www.w3.org/1999/xlink"
9 xmlns:
ex=
"http://exslt.org/dates-and-times"
10 xmlns:
em=
"http://exslt.org/math"
11 xmlns:
es=
"http://exslt.org/sets"
12 xmlns:
ec=
"http://exslt.org/common"
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"/>
72 <xsl:apply-templates select=
"p:clays"/>
75 <title>Non-glaze Samples
</title>
76 <para>This section contains samples which aren't of glazes,
77 such as melt tests. See also the samples that have at least
78 <phrase xlink:
href=
"#Transparent">transparent
79 glaze
</phrase> as glazing, which contains similar kind
82 <xsl:apply-templates select=
"p:samples/p:sample[not(p:glazing | p:brushon)]"/>
87 <title>Oven Programs
</title>
89 <para>Unless otherwise stated, all firings were done with the following settings.
</para>
94 <entry>Program Code
</entry>
100 <entry>Temp
2</entry>
101 <entry>Time
2</entry>
108 <entry>Bisque
</entry>
119 <entry>Decal
& Luster
</entry>
130 <entry>Unused Bisque Program
</entry>
156 <xsl:call-template name=
"sourcesAppendix"/>
160 <xsl:template match=
"p: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>
179 <xsl:value-of select=
"substring(@xml:id, 2)"/>
181 <xsl:apply-templates/>
185 <xsl:template match=
"p:clayref">
187 <emphasis>Clay
</emphasis>:
<phrase xlink:
href=
"#{@idref}">
188 <xsl:value-of select=
"/p:pottery/p:clays/p:clay[@xml:id = current()/@idref]/@name"/></phrase>
189 <xsl:apply-templates select=
"@weightWhenWet"/>
194 <xsl:template match=
"@weightWhenWet">
195 <xsl:text>, weight
</xsl:text>
196 <emphasis>when wet
</emphasis>:
197 <constant><xsl:value-of select=
"."/></constant> g
200 <xsl:template match=
"p:note">
202 <title><xsl:value-of select=
"@date"/></title>
203 <para><xsl:value-of select=
"."/></para>
207 <xsl:template match=
"p:glazes">
209 <title>Glazes
</title>
211 <para>A total of
<xsl:value-of select=
"count(//p:sample)"/> sample bricks.
</para>
213 <xsl:apply-templates select=
"p:glaze">
214 <xsl:sort select=
"@name"/>
215 </xsl:apply-templates>
219 <xsl:template match=
"p:glaze">
221 <xsl:attribute name=
"xml:id"><xsl:value-of select=
"@xml:id"/></xsl:attribute>
223 <xsl:value-of select=
"@name"/>
224 <xsl:if test=
"@productID">,
225 <xsl:value-of select=
"@productID"/>
227 <xsl:if test=
"@type = 'BrushOn'"> (brush-on)
</xsl:if>
230 <xsl:apply-templates select=
"db:para"/>
232 <xsl:apply-templates select=
"p:recipe"/>
234 <xsl:variable name=
"piecesUsing" select=
"//p:pieces/p:piece[p:glazing/@idref = current()/@xml:id]"/>
235 <xsl:if test=
"$piecesUsing">
237 <xsl:for-each select=
"$piecesUsing">
238 <db:xref xlink:
href=
"#{@xml:id}"/>
239 <xsl:if test=
"position() = last() - 1">
240 <xsl:text> and
</xsl:text>
242 <xsl:if test=
"position() < last() - 1">
243 <xsl:text>,
</xsl:text>
245 <xsl:if test=
"position() = last()">
246 <xsl:text>.
</xsl:text>
252 <xsl:apply-templates select=
"//p:samples/p:sample[(p:brushon | p:glazing)[@idref = current()/@xml:id]]">
253 <!-- TODO This just doesn't seem to work. -->
254 <xsl:sort data-type=
"number" select=
"number(substring(@xml:id, 2))"/>
255 <!--<xsl:sort data-type="number" select="number(p:glazing/@hydrometerGravity)"/>-->
256 <xsl:with-param name=
"mainGlaze" select=
"@xml:id"/>
257 </xsl:apply-templates>
262 <xsl:template name=
"imageForSample">
263 <xsl:param name=
"sampleName"/>
264 <xsl:param name=
"imageName"/>
267 <imagedata align=
"right" format=
"JPG" fileref=
"../Images/Samples/{$sampleName}/{$imageName}.jpg"/>
272 <xsl:template match=
"p:piece/p:image">
275 <imagedata align=
"right" format=
"JPG" fileref=
"../Images/Pieces/{../@xml:id}/{.}.jpg"/>
280 <xsl:template match=
"p:sample">
281 <xsl:param name=
"mainGlaze"/>
283 <title><xsl:apply-templates select=
"p:brick"/></title>
285 <para><date><xsl:value-of select=
"@date"/></date></para>
287 <xsl:apply-templates select=
"(p:glazing | p:brushon)[@idref = $mainGlaze]" mode=
"lowKeyGlazing"/>
289 <xsl:variable name=
"additionalGlazes" select=
"(p:brushon | p:glazing)[@idref != $mainGlaze]"/>
290 <xsl:if test=
"(p:brushon | p:glazing)[@idref != $mainGlaze]">
291 <para>Additional glaze
<xsl:if test=
"count($additionalGlazes) > 1">s
</xsl:if>:
</para>
292 <xsl:apply-templates select=
"(p:brushon | p:glazing)[@idref != $mainGlaze]"/>
294 <xsl:apply-templates select=
"p:clayref"/>
295 <xsl:apply-templates select=
"db:para"/>
296 <xsl:apply-templates mode=
"doImage" select=
"p:brick"/>
300 <xsl:template mode=
"doImage" match=
"p:brick">
301 <xsl:call-template name=
"imageForSample">
302 <xsl:with-param name=
"sampleName" select=
"@xml:id"/>
303 <xsl:with-param name=
"imageName" select=
"@xml:id"/>
307 <xsl:template match=
"p:sample/p:para">
309 <title><xsl:value-of select=
"../@date"/></title>
311 <xsl:apply-templates select=
"."/>
316 <xsl:template match=
"p:glazing">
317 <para><phrase xlink:
href=
"#{@idref}"><xsl:value-of select=
"/p:pottery/p:glazes/p:glaze[@xml:id = current()/@idref]/@name"/></phrase>,
318 <xsl:apply-templates select=
"." mode=
"lowKeyGlazing"/>
322 <xsl:template match=
"p:brushon">
323 <para><phrase xlink:
href=
"#{@idref}"><xsl:value-of select=
"/p:pottery/p:glazes/p:glaze[@xml:id = current()/@idref]/@name"/></phrase></para>
326 <xsl:template match=
"p:glazing" mode=
"lowKeyGlazing">
327 <xsl:apply-templates select=
"@hydrometerGravity"/>
328 <xsl:apply-templates select=
"@sieved"/>
331 <xsl:template match=
"@hydrometerGravity">
332 <emphasis>hydrometer gravity
</emphasis>
333 <xsl:text> </xsl:text>
334 <constant><xsl:value-of select=
"."/></constant>
337 <xsl:template match=
"@sieved">,
340 <xsl:when test=
". = 'WithMixer'">
343 <xsl:when test=
". = 'no'">
347 sieved with mesh size
<constant><xsl:value-of select=
"."/></constant>
353 <xsl:template match=
"p:brick">
354 <xsl:value-of select=
"@xml:id"/>
355 <xsl:text> </xsl:text>
358 <xsl:template name=
"sourcesAppendix">
360 <title>Sources
</title>
361 <para>This document was generated from the following sources. The string following the file date is the git SHA1 checksum.
</para>
363 <xsl:apply-templates select=
"document('sources.xml')/p:sources/p:source"/>
368 <xsl:template match=
"p:source">
371 <filename><xsl:value-of select=
"@href"/></filename>
372 <xsl:text>,
</xsl:text>
373 <date><xsl:value-of select=
"@date"/></date>
374 <xsl:text>,
</xsl:text>
375 <systemitem><xsl:value-of select=
"@gitSHA1"/></systemitem>
380 <xsl:template match=
"p:clays">
383 <xsl:apply-templates/>
387 <xsl:template match=
"p:clay">
389 <xsl:attribute name=
"xml:id"><xsl:value-of select=
"@xml:id"/></xsl:attribute>
391 <xsl:value-of select=
"@name"/>
392 <xsl:if test=
"@productID">,
393 <xsl:value-of select=
"@productID"/>
400 <xsl:template match=
"@* | db:* | @xlink:*">
402 <xsl:apply-templates select=
"@*|node()"/>
406 <xsl:template match=
"db:date">
407 <emphasis><xsl:value-of select=
"."/></emphasis>
408 <xsl:text> </xsl:text>
411 <xsl:template match=
"p:recipe">
414 <xsl:variable name=
"hasReplacement" select=
"p:component/@replacementFor"/>
417 <entry>Component
</entry>
418 <xsl:if test=
"$hasReplacement">
419 <entry>Source/Replacement For
</entry>
422 <entry>Price/kg, MVA
</entry>
428 <xsl:if test=
"sum(p:component/@parts) < 100">
429 <xsl:message terminate=
"yes">The components for glaze
<xsl:value-of select=
"../@name"/> amount to less than
100 parts
</xsl:message>
431 <xsl:if test=
"$hasReplacement">
434 <entry>Total
<xsl:value-of select=
"sum(p:component/@parts)"/></entry>
436 <xsl:variable name=
"componentPrices">
437 <xsl:apply-templates mode=
"computePrice" select=
"p:component"/>
440 Kilo price: TODO
<xsl:value-of select=
"sum(ec:node-set($componentPrices))"/>
445 <xsl:apply-templates select=
"p:component">
446 <xsl:with-param name=
"hasReplacement" select=
"$hasReplacement"/>
447 </xsl:apply-templates>
453 <xsl:template match=
"p:component">
454 <xsl:param name=
"hasReplacement"/>
457 <xsl:variable name=
"component" select=
"/p:pottery/p:components/p:component[@xml:id = current()/@idref]"/>
458 <xsl:call-template name=
"checkComponentRef">
459 <xsl:with-param name=
"component" select=
"$component"/>
460 <xsl:with-param name=
"name" select=
"@idref"/>
462 <entry><xsl:value-of select=
"$component"/></entry>
463 <xsl:if test=
"@replacementFor">
464 <xsl:variable name=
"replacement" select=
"/p:pottery/p:components/p:component[@xml:id = current()/@replacementFor]"/>
465 <xsl:call-template name=
"checkComponentRef">
466 <xsl:with-param name=
"component" select=
"$replacement"/>
467 <xsl:with-param name=
"name" select=
"@replacementFor"/>
469 <entry><xsl:value-of select=
"$replacement"/></entry>
472 <xsl:if test=
"$hasReplacement and not(@replacementFor)">
475 <entry><constant><xsl:value-of select=
"@parts"/></constant></entry>
478 <xsl:apply-templates mode=
"computePrice" select=
"."/>
483 <xsl:template mode=
"computePrice" match=
"p:component">
485 <xsl:variable name=
"price" select=
"number(/p:pottery/p:components/p:component[@xml:id = current()/@idref]/@price)"/>
486 <xsl:variable name=
"priceIsFor" select=
"number(/p:pottery/p:components/p:component[@xml:id = current()/@idref]/@priceIsFor)"/>
488 <xsl:value-of select=
"round((($price div ($priceIsFor div 1000)) * (@parts div 100)) * 1.25)"/>
492 <xsl:template match=
"p:measurementsWhenDone">
493 <para>Measurements: height
<constant><xsl:value-of select=
"@height"/></constant> mm,
495 <xsl:when test=
"@width = @depth">
496 diameter
<constant><xsl:value-of select=
"@width"/></constant> mm
499 width
<constant><xsl:value-of select=
"@width"/></constant> mm,
500 depth
<constant><xsl:value-of select=
"@depth"/></constant> mm
506 <xsl:template name=
"checkComponentRef">
507 <xsl:param name=
"component"/>
508 <xsl:param name=
"name"/>
510 <xsl:if test=
"not($component)">
511 <xsl:message terminate=
"yes">Component for reference
<xsl:value-of select=
"$name"/> couldn't be found.
</xsl:message>
515 <!-- We don't use it directly. -->
516 <xsl:template match=
"p:samples"/>
518 <!-- Flag things we miss. -->
519 <xsl:template match=
"* | @*">
520 <xsl:message terminate=
"yes">
521 Unmatched node:
<xsl:value-of select=
"name()"/> <xsl:value-of select=
"string()"/>
528 vim: et:ts=4:sw=4:sts=4