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