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="types"/> 7 8 <!-- Add or process type elements inside item elements. --> 9 10 <xsl:template match="item"> 11 <!-- Copy the element and its contents. --> 12 <xsl:copy> 13 <xsl:apply-templates select="@*"/> 14 <!-- Look for a types element. --> 15 <xsl:call-template name="types"/> 16 <xsl:apply-templates select="*[local-name() != 'types']"/> 17 </xsl:copy> 18 </xsl:template> 19 20 <!-- Investigate types elements. --> 21 22 <xsl:template name="types"> 23 <!-- Make the elements. --> 24 <types> 25 <type> 26 <!-- Look for type element values. --> 27 <xsl:call-template name="type-enum"> 28 <!-- Supply the existing type values. --> 29 <xsl:with-param name="values" select="types/type/@value"/> 30 </xsl:call-template> 31 </type> 32 </types> 33 </xsl:template> 34 35 <!-- Add to type elements the range of acceptable values. --> 36 37 <xsl:template name="type-enum"> 38 <xsl:param name="values"/> 39 <!-- Find all values in the range and add them. --> 40 <xsl:for-each select="$types/types/type-enum"> 41 <xsl:copy> 42 <xsl:apply-templates select="@*"/> 43 <!-- Mark those whose value are the same as that found on the element. --> 44 <xsl:if test="$values[string() = current()/@value]"> 45 <xsl:attribute name="value-is-set">true</xsl:attribute> 46 </xsl:if> 47 </xsl:copy> 48 </xsl:for-each> 49 </xsl:template> 50 51 <!-- Replicate unknown elements. --> 52 53 <xsl:template match="@*|*|node()"> 54 <xsl:copy> 55 <xsl:apply-templates select="@*|*|node()"/> 56 </xsl:copy> 57 </xsl:template> 58 59 </xsl:stylesheet>