1 <?xml version="1.0"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 4 xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias" 5 xmlns:template="http://www.boddie.org.uk/ns/xmltools/template"> 6 7 <xsl:output indent="yes"/> 8 <xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/> 9 10 11 12 <!-- Match the document itself. --> 13 14 <xsl:template match="/"> 15 <axsl:stylesheet version="1.0"> 16 17 <axsl:output indent="yes"/> 18 <!-- NOTE: Hard-coded doctypes to hopefully satisfy JavaScript code. --> 19 <!-- doctype-public="-//W3C//DTD XHTML 1.1//EN" 20 doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" --> 21 22 <axsl:template match="/"> 23 24 <!-- Include the remaining attributes. --> 25 <xsl:apply-templates select="@*"/> 26 27 <!-- Process the elements. --> 28 <xsl:apply-templates select="*"/> 29 30 </axsl:template> 31 </axsl:stylesheet> 32 </xsl:template> 33 34 35 36 <!-- Match special conditional expression attributes. --> 37 38 <xsl:template match="*[@template:if]"> 39 <axsl:if test="{@template:if}"> 40 <xsl:choose> 41 <xsl:when test="@template:element"> 42 <xsl:call-template name="enter-element"> 43 <xsl:with-param name="other-elements" select="@template:element"/> 44 </xsl:call-template> 45 </xsl:when> 46 <xsl:otherwise> 47 <xsl:call-template name="enter-attribute"/> 48 </xsl:otherwise> 49 </xsl:choose> 50 </axsl:if> 51 </xsl:template> 52 53 54 55 <!-- Match element references. --> 56 57 <xsl:template match="*[not(@template:if) and @template:element]"> 58 <xsl:call-template name="enter-element"> 59 <xsl:with-param name="other-elements" select="@template:element"/> 60 </xsl:call-template> 61 </xsl:template> 62 63 <xsl:template name="enter-element"> 64 <xsl:param name="other-elements"/> 65 <xsl:variable name="first-element" select="substring-before($other-elements, ',')"/> 66 <xsl:variable name="remaining-elements" select="substring-after($other-elements, ',')"/> 67 <xsl:choose> 68 <xsl:when test="$first-element = ''"> 69 <xsl:call-template name="next-element"> 70 <xsl:with-param name="first-element" select="$other-elements"/> 71 </xsl:call-template> 72 </xsl:when> 73 <xsl:otherwise> 74 <xsl:call-template name="next-element"> 75 <xsl:with-param name="first-element" select="$first-element"/> 76 <xsl:with-param name="remaining-elements" select="$remaining-elements"/> 77 </xsl:call-template> 78 </xsl:otherwise> 79 </xsl:choose> 80 </xsl:template> 81 82 <xsl:template name="next-element"> 83 <xsl:param name="first-element"/> 84 <xsl:param name="remaining-elements"/> 85 <axsl:for-each select="{$first-element}"> 86 <xsl:choose> 87 <xsl:when test="$remaining-elements = ''"> 88 <xsl:call-template name="enter-attribute"/> 89 </xsl:when> 90 <xsl:otherwise> 91 <xsl:call-template name="enter-element"> 92 <xsl:with-param name="other-elements" select="$remaining-elements"/> 93 </xsl:call-template> 94 </xsl:otherwise> 95 </xsl:choose> 96 </axsl:for-each> 97 </xsl:template> 98 99 100 101 <!-- Match special expression attributes. --> 102 103 <xsl:template match="*[not(@template:if) and not(@template:element) and (@template:attribute or @template:value or @template:expr)]"> 104 <xsl:call-template name="enter-attribute"/> 105 </xsl:template> 106 107 <xsl:template name="enter-attribute"> 108 <xsl:choose> 109 <xsl:when test="@template:attribute"> 110 <axsl:choose> 111 <axsl:when test="@{@template:attribute}"> 112 <axsl:variable name="this-name"><xsl:value-of select="@template:attribute"/></axsl:variable> 113 <axsl:variable name="this-value" select="@{@template:attribute}"/> 114 <xsl:call-template name="special-attributes"/> 115 </axsl:when> 116 <axsl:otherwise> 117 <axsl:variable name="this-name"><xsl:value-of select="@template:attribute"/></axsl:variable> 118 <axsl:variable name="this-value"></axsl:variable> 119 <xsl:call-template name="special-attributes"/> 120 </axsl:otherwise> 121 </axsl:choose> 122 </xsl:when> 123 <xsl:otherwise> 124 <xsl:call-template name="special-attributes"/> 125 </xsl:otherwise> 126 </xsl:choose> 127 </xsl:template> 128 129 <xsl:template name="special-attributes"> 130 <xsl:choose> 131 <xsl:when test="@template:effect = 'replace'"> 132 <xsl:call-template name="special-value"/> 133 </xsl:when> 134 <xsl:otherwise> 135 <xsl:copy> 136 <xsl:apply-templates select="@*"/> 137 <xsl:if test="@template:expr and @template:expr-attr"> 138 <axsl:if test="{@template:expr}"> 139 <axsl:attribute name="{@template:expr-attr}"><xsl:value-of select="@template:expr-attr"/></axsl:attribute> 140 </axsl:if> 141 </xsl:if> 142 <xsl:call-template name="special-value"/> 143 </xsl:copy> 144 </xsl:otherwise> 145 </xsl:choose> 146 </xsl:template> 147 148 <xsl:template name="special-value"> 149 <xsl:choose> 150 <xsl:when test="@template:value"> 151 <axsl:value-of select="{@template:value}"/> 152 </xsl:when> 153 <xsl:otherwise> 154 <xsl:apply-templates select="node()"/> 155 </xsl:otherwise> 156 </xsl:choose> 157 </xsl:template> 158 159 160 161 <!-- Remove template attributes. --> 162 163 <xsl:template match="@template:element|@template:attribute|@template:value|@template:expr|@template:expr-attr|@template:effect|@template:if"> 164 </xsl:template> 165 166 167 168 <!-- Replicate unknown elements. --> 169 170 <xsl:template match="@*|node()"> 171 <xsl:copy> 172 <xsl:apply-templates select="@*|node()"/> 173 </xsl:copy> 174 </xsl:template> 175 176 </xsl:stylesheet>