1 <?xml version="1.0" encoding="utf-8"?> 2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 3 xmlns:template="http://www.boddie.org.uk/ns/xmltools/template" 4 version="1.0"> 5 6 <xsl:param name="database"/> 7 8 <xsl:template match="configuration"> 9 <xsl:copy> 10 <xsl:apply-templates select="@*"/> 11 <!-- Complete all multiple choice fields. --> 12 <details> 13 <xsl:call-template name="complete-element"> 14 <xsl:with-param name="found-elements" select="details/base-system"/> 15 <xsl:with-param name="element-name">base-system</xsl:with-param> 16 </xsl:call-template> 17 <xsl:call-template name="complete-element"> 18 <xsl:with-param name="found-elements" select="details/cpu"/> 19 <xsl:with-param name="element-name">cpu</xsl:with-param> 20 </xsl:call-template> 21 </details> 22 <memory> 23 <xsl:for-each select="memory/memory-unit"> 24 <xsl:call-template name="complete-element"> 25 <xsl:with-param name="found-elements" select="."/> 26 <xsl:with-param name="element-name">memory-unit</xsl:with-param> 27 </xsl:call-template> 28 </xsl:for-each> 29 </memory> 30 <hard-disks> 31 <xsl:for-each select="hard-disks/hard-disk"> 32 <xsl:call-template name="complete-element"> 33 <xsl:with-param name="found-elements" select="."/> 34 <xsl:with-param name="element-name">hard-disk</xsl:with-param> 35 </xsl:call-template> 36 </xsl:for-each> 37 </hard-disks> 38 <storage> 39 <xsl:for-each select="storage/storage-unit"> 40 <xsl:call-template name="complete-element"> 41 <xsl:with-param name="found-elements" select="."/> 42 <xsl:with-param name="element-name">storage-unit</xsl:with-param> 43 </xsl:call-template> 44 </xsl:for-each> 45 </storage> 46 <peripherals> 47 <xsl:call-template name="complete-element"> 48 <xsl:with-param name="found-elements" select="peripherals/keyboard"/> 49 <xsl:with-param name="element-name">keyboard</xsl:with-param> 50 </xsl:call-template> 51 <xsl:call-template name="complete-element"> 52 <xsl:with-param name="found-elements" select="peripherals/mouse"/> 53 <xsl:with-param name="element-name">mouse</xsl:with-param> 54 </xsl:call-template> 55 <xsl:call-template name="complete-element"> 56 <xsl:with-param name="found-elements" select="peripherals/screen"/> 57 <xsl:with-param name="element-name">screen</xsl:with-param> 58 </xsl:call-template> 59 </peripherals> 60 </xsl:copy> 61 </xsl:template> 62 63 <xsl:template name="complete-element"> 64 <xsl:param name="found-elements"/> 65 <xsl:param name="element-name"/> 66 <xsl:variable name="element-enum-name"><xsl:value-of select="$element-name"/>-enum</xsl:variable> 67 <xsl:variable name="has-set-values" select="$found-elements[@value]"/> 68 <!-- Make the element with the different values. --> 69 <xsl:element name="{$element-name}"> 70 <!-- Find the values in the database. --> 71 <xsl:for-each select="$database/database/*[local-name() = $element-name]/*[local-name() = $element-enum-name]"> 72 <xsl:variable name="enum-element" select="."/> 73 <!-- Copy each option. --> 74 <xsl:copy> 75 <!-- Only include the value, adding the price only if the item is selected. --> 76 <xsl:apply-templates select="@value"/> 77 <!-- Find whether this item is selected. --> 78 <xsl:choose> 79 <!-- In the current field, the value attribute matches this value. --> 80 <xsl:when test="$found-elements[@value = $enum-element/@value]"> 81 <xsl:attribute name="value-is-set">true</xsl:attribute> 82 <xsl:apply-templates select="@price"/> 83 </xsl:when> 84 <!-- This value is the first and no value attribute is specified. --> 85 <xsl:when test="not($has-set-values) and count($enum-element/preceding-sibling::*) = 0"> 86 <xsl:attribute name="value-is-set">true</xsl:attribute> 87 <xsl:apply-templates select="@price"/> 88 </xsl:when> 89 <xsl:otherwise/> 90 </xsl:choose> 91 </xsl:copy> 92 </xsl:for-each> 93 </xsl:element> 94 </xsl:template> 95 96 <!-- Replicate unknown elements. --> 97 98 <xsl:template match="@*|node()"> 99 <xsl:copy> 100 <xsl:apply-templates select="@*|node()"/> 101 </xsl:copy> 102 </xsl:template> 103 104 </xsl:stylesheet>