Annotation of kupu/make.xsl, revision 1.1
1.1 ! dwinter 1: <?xml version="1.0" encoding="utf-8"?>
! 2: <!--
! 3: ##############################################################################
! 4: #
! 5: # Copyright (c) 2003-2005 Kupu Contributors. All rights reserved.
! 6: #
! 7: # This software is distributed under the terms of the Kupu
! 8: # License. See LICENSE.txt for license text. For a list of Kupu
! 9: # Contributors see CREDITS.txt.
! 10: #
! 11: ##############################################################################
! 12:
! 13: Generate an HTML template from Kupu distribution files
! 14:
! 15: This XSLT is fed a Kupu distribution file (generally dist.kupu) which
! 16: contains:
! 17:
! 18: a) slot definitions,
! 19:
! 20: b) feature and part definitions,
! 21:
! 22: c) wiring that matches parts to slots,
! 23:
! 24: d) an order in which implementations are to be cascaded.
! 25:
! 26: If the XSLT processor supports XInclude, the above stated items may of
! 27: course be located in different files and included later.
! 28:
! 29: $Id: make.xsl 14502 2005-07-11 14:06:43Z duncan $
! 30: -->
! 31: <xsl:stylesheet
! 32: xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
! 33: xmlns:kupu="http://kupu.oscom.org/namespaces/dist"
! 34: version="1.0"
! 35: >
! 36:
! 37: <xsl:output
! 38: method="xml"
! 39: indent="yes"
! 40: encoding="ascii"
! 41: omit-xml-declaration="yes"
! 42: />
! 43:
! 44: <xsl:strip-space
! 45: elements="kupu:*"
! 46: />
! 47:
! 48: <xsl:preserve-space
! 49: elements="kupu:part"
! 50: />
! 51:
! 52: <!-- ### Global parameters ### -->
! 53:
! 54: <!-- debug :: enables some debugging messages; by default false -->
! 55: <xsl:param
! 56: name="debug"
! 57: select="false()"
! 58: />
! 59:
! 60:
! 61: <!-- ### Templates ### -->
! 62:
! 63: <!-- document element -->
! 64: <xsl:template match="/kupu:dist">
! 65: <xsl:apply-templates />
! 66: </xsl:template>
! 67:
! 68: <!-- Ignore kupu stuff outside expand -->
! 69: <xsl:template match="//kupu:*" />
! 70:
! 71:
! 72: <!-- ## Expand mode templates ## -->
! 73:
! 74: <!-- Anything in kupu:expand runs in expand mode. This is where the
! 75: whole things starts. -->
! 76: <xsl:template match="//kupu:expand">
! 77: <xsl:apply-templates mode="expand" />
! 78: </xsl:template>
! 79:
! 80: <xsl:template match="//kupu:define-slot" mode="expand">
! 81: <xsl:variable
! 82: name="slot"
! 83: select="@name"
! 84: />
! 85:
! 86: <!-- Debug -->
! 87: <xsl:if test="$debug">
! 88: <xsl:comment>
! 89: Slot named '<xsl:value-of select="$slot" />' defined.
! 90: </xsl:comment>
! 91: </xsl:if>
! 92:
! 93: <!-- We'll try to find a wiring that tells us what should go into
! 94: our slot -->
! 95:
! 96: <xsl:call-template name="fill-slot">
! 97: <xsl:with-param
! 98: name="slot"
! 99: select="$slot"
! 100: />
! 101: </xsl:call-template>
! 102:
! 103: </xsl:template>
! 104:
! 105: <!-- Named template that looks for an appropriate fill-slot element
! 106: in a wiring. It recursively browses through implementations; that
! 107: way wirings of different implementations cascade -->
! 108: <xsl:template name="fill-slot">
! 109: <xsl:param name="implno" select="1" />
! 110: <xsl:param name="slot" />
! 111:
! 112: <xsl:variable
! 113: name="impl"
! 114: select="//kupu:implementation-order/kupu:implementation[$implno]/@name"
! 115: />
! 116:
! 117: <xsl:variable
! 118: name="fillnode"
! 119: select="//kupu:wire[@implementation=$impl]/kupu:fill-slot[@name=$slot]"
! 120: />
! 121:
! 122: <xsl:choose>
! 123: <!-- if we've found a valid implementation, go for it -->
! 124: <xsl:when test="$fillnode">
! 125: <!-- Debug -->
! 126: <xsl:if test="$debug">
! 127: <xsl:comment>
! 128: Found wiring for slot '<xsl:value-of select="$slot" />',
! 129: at implementation no. <xsl:value-of select="$implno" />,
! 130: '<xsl:value-of select="$impl" />'.
! 131: </xsl:comment>
! 132: </xsl:if>
! 133: <xsl:apply-templates select="$fillnode" mode="expand" />
! 134: </xsl:when>
! 135: <xsl:otherwise>
! 136: <!-- Cascade onto the next implementation under two circumstances:
! 137: a) A specific implementation wasn't request: not(@implementation)
! 138: b) We're already in the last implementation -->
! 139: <xsl:choose>
! 140: <xsl:when test="$implno <= count(//kupu:implementation-order/kupu:implementation)">
! 141: <xsl:call-template name="fill-slot">
! 142: <xsl:with-param name="implno" select="$implno+1" />
! 143: <xsl:with-param name="slot" select="$slot" />
! 144: </xsl:call-template>
! 145: </xsl:when>
! 146: <xsl:otherwise>
! 147: <xsl:comment>
! 148: Cannot find wiring for slot '<xsl:value-of select="$slot" />'.
! 149: </xsl:comment>
! 150: </xsl:otherwise>
! 151: </xsl:choose>
! 152: </xsl:otherwise>
! 153: </xsl:choose>
! 154:
! 155: </xsl:template>
! 156:
! 157: <xsl:template match="//kupu:insert-ids" mode="expand">
! 158: <xsl:apply-templates select="//kupu:id" mode="expand" />
! 159: </xsl:template>
! 160: <xsl:template match="//kupu:id" mode="expand">
! 161: <xsl:comment><xsl:value-of select="." /></xsl:comment>
! 162: <xsl:text>
! 163: </xsl:text>
! 164:
! 165: </xsl:template>
! 166:
! 167: <!-- Handle part insertion; we delegate the work to the named
! 168: template below -->
! 169: <xsl:template match="//kupu:insert-part" mode="expand">
! 170: <xsl:variable
! 171: name="feature"
! 172: select="@feature"
! 173: />
! 174: <xsl:variable
! 175: name="part"
! 176: select="@part"
! 177: />
! 178: <xsl:choose>
! 179: <xsl:when test="//kupu:disable-feature[@name=$feature]">
! 180: <xsl:if test="$debug">
! 181: <xsl:comment>
! 182: Feature '<xsl:value-of select="$feature" />' was disabled.
! 183: </xsl:comment>
! 184: </xsl:if>
! 185: </xsl:when>
! 186: <xsl:when test="//kupu:disable-part[@feature=$feature and @part=$part]">
! 187: <xsl:if test="$debug">
! 188: <xsl:comment>
! 189: Part '<xsl:value-of select="$part" />' in feature
! 190: '<xsl:value-of select="$feature" />' was disabled.
! 191: </xsl:comment>
! 192: </xsl:if>
! 193: </xsl:when>
! 194: <xsl:otherwise>
! 195: <xsl:call-template name="insert-part">
! 196: <xsl:with-param
! 197: name="feature"
! 198: select="$feature"
! 199: />
! 200: <xsl:with-param
! 201: name="part"
! 202: select="$part"
! 203: />
! 204: </xsl:call-template>
! 205: </xsl:otherwise>
! 206: </xsl:choose>
! 207: </xsl:template>
! 208:
! 209: <!-- This template recursively looks for feature/part
! 210: implementations and inserts the first it finds -->
! 211: <xsl:template name="insert-part">
! 212: <xsl:param name="implno" select="1" />
! 213: <xsl:param name="feature" />
! 214: <xsl:param name="part" />
! 215:
! 216: <!-- The caller can provide us with a specific implementation
! 217: name; if not provided, fall back to the implementation given
! 218: in 'implno'. -->
! 219: <xsl:param name="implementation" />
! 220:
! 221: <xsl:variable name="impl">
! 222: <xsl:choose>
! 223: <xsl:when test="$implementation">
! 224: <xsl:value-of select="$implementation" />
! 225: </xsl:when>
! 226: <xsl:otherwise>
! 227: <xsl:value-of
! 228: select="//kupu:implementation-order/kupu:implementation[$implno]/@name"
! 229: />
! 230: </xsl:otherwise>
! 231: </xsl:choose>
! 232: </xsl:variable>
! 233:
! 234: <xsl:variable
! 235: name="partnode"
! 236: select="//kupu:feature[@name=$feature and @implementation=$impl]/kupu:part[@name=$part]"
! 237: />
! 238:
! 239: <xsl:choose>
! 240: <!-- if we've found a valid implementation, go for it -->
! 241: <xsl:when test="$partnode">
! 242: <!-- Debug -->
! 243: <xsl:if test="$debug">
! 244: <xsl:comment>
! 245: Found feature '<xsl:value-of select="$feature" />',
! 246: part '<xsl:value-of select="$part" />' at implementation no.
! 247: <xsl:value-of select="$implno" />, '<xsl:value-of select="$impl" />'.
! 248: </xsl:comment>
! 249: </xsl:if>
! 250: <xsl:apply-templates select="$partnode" mode="expand" />
! 251: </xsl:when>
! 252: <xsl:otherwise>
! 253: <!-- Cascade onto the next implementation under two circumstances:
! 254: a) A specific implementation wasn't request: not(@implementation)
! 255: b) We're already in the last implementation -->
! 256: <xsl:choose>
! 257: <xsl:when test="not($implementation) and $implno <= count(//kupu:implementation-order/kupu:implementation)">
! 258: <xsl:call-template name="insert-part">
! 259: <xsl:with-param name="implno" select="$implno+1" />
! 260: <xsl:with-param name="feature" select="$feature" />
! 261: <xsl:with-param name="part" select="$part" />
! 262: </xsl:call-template>
! 263: </xsl:when>
! 264: <xsl:otherwise>
! 265: <xsl:comment>
! 266: Cannot find feature '<xsl:value-of select="$feature" />',
! 267: part '<xsl:value-of select="$part" />'.
! 268: </xsl:comment>
! 269: </xsl:otherwise>
! 270: </xsl:choose>
! 271: </xsl:otherwise>
! 272: </xsl:choose>
! 273: </xsl:template>
! 274:
! 275: <!-- Make sure that we stay in expand mode once we are in it -->
! 276: <xsl:template match="//kupu:*" mode="expand">
! 277: <xsl:apply-templates mode="expand"/>
! 278: </xsl:template>
! 279:
! 280: <!-- Display other tags (XHTML) verbatim in expand mode -->
! 281: <xsl:template match="*" mode="expand">
! 282: <xsl:copy>
! 283: <xsl:copy-of select="@*" />
! 284: <xsl:apply-templates mode="expand" />
! 285: </xsl:copy>
! 286: </xsl:template>
! 287:
! 288: <!-- Copy nodes through verbatim, but omit the id attribute
! 289: from most of them -->
! 290: <!-- <xsl:template match="*" mode="expand">
! 291: <xsl:choose>
! 292: <xsl:when test="local-name()='xml' or local-name='iframe'">
! 293: <xsl:copy>
! 294: <xsl:copy-of select="@*" />
! 295: <xsl:apply-templates mode="expand" />
! 296: </xsl:copy>
! 297: </xsl:when>
! 298: <xsl:otherwise>
! 299: <xsl:copy>
! 300: <xsl:copy-of select="@*[local-name() != 'id']" />
! 301: <xsl:apply-templates mode="expand" />
! 302: </xsl:copy>
! 303: </xsl:otherwise>
! 304: </xsl:choose>
! 305: </xsl:template> -->
! 306:
! 307: </xsl:stylesheet>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>