Subject: [xsl] xslt style From: S Woodside <sbwoodside@xxxxxxxxx> Date: Fri, 10 Jan 2003 02:38:00 -0500 |
But to answer your more general question, you're correct that in unextended XSLT 1.0 you have to call templates to perform functions and that sometimes this can lead to verbose and ungainly code. However, most XSLT processors have a mechanism for defining extension functions. Several support EXSLT's func:function/func:result elements, which enable you to do:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*" /> <xsl:output omit-xml-declaration = "yes"/>
<xsl:template match="grammar"> <div class="form"> <h1>A Form</h1> <p>Here's a form for you. It's based on an RNG grammar.</p> <form action="form.html" method="GET"> <xsl:apply-templates/> <button type="reset">Reset</button> <button type="submit">Submit</button> </form> <p>That's the end of the form.</p> </div> <!--form--> </xsl:template>
<xsl:template match="start"> <xsl:apply-templates/> </xsl:template>
<xsl:template match="choice"> Choice: <xsl:call-template name="simpleRecurse"/> </xsl:template>
<xsl:template match="value"> <xsl:call-template name="radio"/> Value could be <b><xsl:value-of select="."/></b> </xsl:template>
<xsl:template match="group"> Group: <xsl:call-template name="simpleRecurse"/> </xsl:template>
<xsl:template match="optional"> <input type="checkbox"> <xsl:attribute name="name"> <xsl:call-template name="namesAttrsOfAncestors"/> <xsl:call-template name="nameAttrOfDescendant"/> </xsl:attribute> </input> <xsl:call-template name="namesAttrsOfAncestors"/> <xsl:call-template name="nameAttrOfDescendant"/> [ <xsl:call-template name="simpleRecurse"/> ] </xsl:template>
<xsl:template match="zeroOrMore"> Zero or More: <xsl:call-template name="simpleRecurse"/> </xsl:template>
<xsl:template match="oneOrMore"> One or More: <xsl:call-template name="simpleRecurse"/> </xsl:template>
<xsl:template match="element"> <xsl:choose> <xsl:when test="not(./*)"> <!--no children--><!--or ./empty--> <ul><li> <xsl:call-template name="labelTemplate"/> <xsl:call-template name="inputTemplate"/> </li></ul> </xsl:when> <xsl:otherwise> <b><xsl:call-template name="namesAttrsOfAncestors"/></b> <xsl:call-template name="simpleRecurse"/> </xsl:otherwise> </xsl:choose> </xsl:template>
<xsl:template match="attribute"> <xsl:choose> <xsl:when test="not(./*) or ./empty"> <!--no children--> <xsl:call-template name="labelTemplate"/> <xsl:call-template name="inputTemplate"/> </xsl:when> <xsl:otherwise> <b><xsl:call-template name="namesAttrsOfAncestors"/></b> <xsl:call-template name="simpleRecurse"/> </xsl:otherwise> </xsl:choose> ((Attribute)) </xsl:template>
<xsl:template match="text"> <!--Text:--> <!--[[xsl:call-template name="labelTemplate"/]]--> <xsl:call-template name="inputTemplate"/> (text) <xsl:call-template name="simpleRecurse"/> </xsl:template>
<xsl:template match="list"> List: <xsl:call-template name="simpleRecurse"/> </xsl:template>
<xsl:template match="data"> <xsl:call-template name="labelTemplate"/> <xsl:call-template name="listInput"/> (<xsl:value-of select="@type"/>) <!--should check for param children--> </xsl:template>
<!--******************************--> <!--Named templates-->
<xsl:template name="simpleRecurse"> <br /> <xsl:apply-templates/> <br /> </xsl:template>
<xsl:template name="radio"> <input type="radio"> <xsl:attribute name="name"> <xsl:call-template name="namesAttrsOfAncestors"/> </xsl:attribute> <xsl:attribute name="value"> <xsl:value-of select="."/> </xsl:attribute> </input> </xsl:template>
<xsl:template name="listInput"> <input> <xsl:if test="../choice"> <xsl:attribute name="type">radio</xsl:attribute> <xsl:attribute name="name"> <xsl:call-template name="namesAttrsOfAncestors"/> </xsl:attribute> </xsl:if> <xsl:attribute name="id"> <xsl:call-template name="namesAttrsOfAncestors"/> </xsl:attribute> <xsl:attribute name="value"> <xsl:call-template name="namesAttrsOfAncestors"/> </xsl:attribute> </input> </xsl:template>
<xsl:template name="labelTemplate"> <label> <xsl:attribute name="for"> <xsl:call-template name="namesAttrsOfAncestors"/> </xsl:attribute> <b> <xsl:call-template name="namesAttrsOfAncestors"/> </b> </label> </xsl:template>
<xsl:template name="inputTemplate"> <input> <xsl:attribute name="name"> <xsl:call-template name="namesAttrsOfAncestors"/> </xsl:attribute> <xsl:attribute name="value"> <xsl:call-template name="namesAttrsOfAncestors"/> </xsl:attribute> </input> </xsl:template>
<xsl:template match="define"> [Define: <b><xsl:value-of select="@name"/></b>] </xsl:template>
--- www.simonwoodside.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] how to capture a value re, Anthony Kong | Thread | RE: [xsl] xslt style, Michael Kay |
[xsl] Hi everbody, Sai, Mukundan (IE10) | Date | Re: [xsl] Setting some variables, S Woodside |
Month |