Annotation of kupu/make.xsl, revision 1.1.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 &lt;= 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 &lt;= 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>