Re: Updated WADL stylesheet to the 2009-2 namespace/w3c member submission schema

On Jan 18, 2010, at 11:52 AM, John Levins wrote:

> Below is a trivial update to the WADL stylesheet (as provided by Mark
> Nottingham) to use the 2009-02 schema (i.e. the schema linked from
> http://www.w3.org/Submission/2009/SUBM-wadl-20090831/ )
> 
> Essentially the only changes are:
>   - xmlns:wadl and wadl-ns variable changed to
> "http://wadl.dev.java.net/2009/02"
>   - Occurrences of "fault" removed.
> 
> I wasn't sure if there was a suite of test wadl files that should be
> used to test changes to the xsl, I've only run it against the wadl
> files I'm using (transformed using xsltproc).
> 
I suspect some other changes may be required but its possible you won't run into them unless you are using the new features. E.g. the (optional) status attribute moved from the representation element to the response element, additional elements are allowed at the top level and resource types are now more expressive. I blogged about the changes here:

http://weblogs.java.net/blog/2009/02/03/draft-wadl-update

Marc.


> 
> <?xml version="1.0" encoding="UTF-8"?>
> <!--
>  wadl_documentation.xsl (2010-01-01)
> 
>  An XSLT stylesheet for generating HTML documentation from WADL,
>  by Mark Nottingham <mnot@yahoo-inc.com>.
> 
>  Copyright (c) 2006-2008 Yahoo! Inc.
> 
>  This work is licensed under the Creative Commons Attribution-ShareAlike 2.5
>  License. To view a copy of this license, visit
>    http://creativecommons.org/licenses/by-sa/2.5/
>  or send a letter to
>    Creative Commons
>    543 Howard Street, 5th Floor
>    San Francisco, California, 94105, USA
> -->
> <!--
> * FIXME
>    - Doesn't inherit query/header params from resource/@type
>    - XML schema import, include, redefine don't import
> -->
> <!--
>  * TODO
>    - forms
>    - link to or include non-schema variable type defs (as a separate list?)
>    - @href error handling
> -->
> 
> 
> <xsl:stylesheet
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
> xmlns:wadl="http://wadl.dev.java.net/2009/02"
> xmlns:xs="http://www.w3.org/2001/XMLSchema"
> xmlns:html="http://www.w3.org/1999/xhtml"
> xmlns:exsl="http://exslt.org/common"
> xmlns:ns="urn:namespace"
> extension-element-prefixes="exsl"
> xmlns="http://www.w3.org/1999/xhtml"
> exclude-result-prefixes="xsl wadl xs html ns"
>> 
> 
>    <xsl:output
>        method="html"
>        encoding="UTF-8"
>        indent="yes"
>        doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
>        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>    />
> 
>    <xsl:variable name="wadl-ns">http://wadl.dev.java.net/2009/02</xsl:variable>
> 
> 
>    <!-- expand @hrefs, @types into a full tree -->
> 
>    <xsl:variable name="resources">
>        <xsl:apply-templates select="/wadl:application/wadl:resources"
> mode="expand"/>
>    </xsl:variable>
> 
>    <xsl:template match="wadl:resources" mode="expand">
>        <xsl:variable name="base">
>            <xsl:choose>
>                <xsl:when test="substring(@base, string-length(@base),
> 1) = '/'">
>                    <xsl:value-of select="substring(@base, 1,
> string-length(@base) - 1)"/>
>                </xsl:when>
>                <xsl:otherwise><xsl:value-of select="@base"/></xsl:otherwise>
>            </xsl:choose>
>        </xsl:variable>
>        <xsl:element name="resources" namespace="{$wadl-ns}">
>            <xsl:for-each select="namespace::*">
>                <xsl:variable name="prefix" select="name(.)"/>
>                <xsl:if test="$prefix">
>                    <xsl:attribute name="ns:{$prefix}"><xsl:value-of
> select="."/></xsl:attribute>
>                </xsl:if>
>            </xsl:for-each>
>            <xsl:apply-templates select="@*|node()" mode="expand">
>                <xsl:with-param name="base" select="$base"/>
>            </xsl:apply-templates>
>        </xsl:element>
>    </xsl:template>
> 
>    <xsl:template match="wadl:resource[@type]" mode="expand" priority="1">
>        <xsl:param name="base"></xsl:param>
>        <xsl:variable name="uri" select="substring-before(@type, '#')"/>
>        <xsl:variable name="id" select="substring-after(@type, '#')"/>
>        <xsl:element name="resource" namespace="{$wadl-ns}">
> 			<xsl:attribute name="path"><xsl:value-of select="@path"/></xsl:attribute>
>            <xsl:choose>
>                <xsl:when test="$uri">
>                    <xsl:variable name="included" select="document($uri, /)"/>
>                    <xsl:copy-of
> select="$included/descendant::wadl:resource_type[@id=$id]/@*"/>
>                    <xsl:attribute name="id"><xsl:value-of
> select="@type"/>#<xsl:value-of select="@path"/></xsl:attribute>
>                    <xsl:apply-templates
> select="$included/descendant::wadl:resource_type[@id=$id]/*"
> mode="expand">
>                        <xsl:with-param name="base" select="$uri"/>
>                    </xsl:apply-templates>
>                </xsl:when>
>                <xsl:otherwise>
>                    <xsl:copy-of select="//resource_type[@id=$id]/@*"/>
>                    <xsl:attribute name="id"><xsl:value-of
> select="$base"/>#<xsl:value-of select="@type"/>#<xsl:value-of
> select="@path"/></xsl:attribute>
>                    <xsl:apply-templates
> select="//wadl:resource_type[@id=$id]/*" mode="expand">
>                        <xsl:with-param name="base" select="$base"/>
>                    </xsl:apply-templates>
>                </xsl:otherwise>
>            </xsl:choose>
>            <xsl:apply-templates select="node()" mode="expand">
>                <xsl:with-param name="base" select="$base"/>
>            </xsl:apply-templates>
>        </xsl:element>
>    </xsl:template>
> 
>    <xsl:template match="wadl:*[@href]" mode="expand">
>        <xsl:param name="base"></xsl:param>
>        <xsl:variable name="uri" select="substring-before(@href, '#')"/>
>        <xsl:variable name="id" select="substring-after(@href, '#')"/>
>        <xsl:element name="{local-name()}" namespace="{$wadl-ns}">
>            <xsl:copy-of select="@*"/>
>            <xsl:choose>
>                <xsl:when test="$uri">
>                    <xsl:attribute name="id"><xsl:value-of
> select="@href"/></xsl:attribute>
>                    <xsl:variable name="included" select="document($uri, /)"/>
>                    <xsl:apply-templates
> select="$included/descendant::wadl:*[@id=$id]/*" mode="expand">
>                        <xsl:with-param name="base" select="$uri"/>
>                    </xsl:apply-templates>
>                </xsl:when>
>                <xsl:otherwise>
>                    <xsl:attribute name="id"><xsl:value-of
> select="$base"/>#<xsl:value-of select="$id"/></xsl:attribute>
>                    <!-- xsl:attribute name="id"><xsl:value-of
> select="generate-id()"/></xsl:attribute -->
>                    <xsl:attribute name="element"><xsl:value-of
> select="//wadl:*[@id=$id]/@element"/></xsl:attribute>
>                    <xsl:attribute name="mediaType"><xsl:value-of
> select="//wadl:*[@id=$id]/@mediaType"/></xsl:attribute>
>                    <xsl:attribute name="status"><xsl:value-of
> select="//wadl:*[@id=$id]/@status"/></xsl:attribute>
>                    <xsl:attribute name="name"><xsl:value-of
> select="//wadl:*[@id=$id]/@name"/></xsl:attribute>
>                    <xsl:apply-templates select="//wadl:*[@id=$id]/*"
> mode="expand">
>                        <xsl:with-param name="base" select="$base"/>
>                    </xsl:apply-templates>
>                </xsl:otherwise>
>            </xsl:choose>
>        </xsl:element>
>    </xsl:template>
> 
>    <xsl:template match="node()[@id]" mode="expand">
>        <xsl:param name="base"></xsl:param>
>        <xsl:element name="{local-name()}" namespace="{$wadl-ns}">
>            <xsl:copy-of select="@*"/>
>            <xsl:attribute name="id"><xsl:value-of
> select="$base"/>#<xsl:value-of select="@id"/></xsl:attribute>
>            <!-- xsl:attribute name="id"><xsl:value-of
> select="generate-id()"/></xsl:attribute -->
>            <xsl:apply-templates select="node()" mode="expand">
>                <xsl:with-param name="base" select="$base"/>
>            </xsl:apply-templates>
>        </xsl:element>
>    </xsl:template>
> 
>    <xsl:template match="@*|node()" mode="expand">
>        <xsl:param name="base"></xsl:param>
>        <xsl:copy>
>            <xsl:apply-templates select="@*|node()" mode="expand">
>                <xsl:with-param name="base" select="$base"/>
>            </xsl:apply-templates>
>        </xsl:copy>
>    </xsl:template>
> 
> <!-- debug $resources
>    <xsl:template match="/">
>    <xsl:copy-of select="$resources"/>
>    </xsl:template>
> -->
> 
>    <!-- collect grammars (TODO: walk over $resources instead) -->
> 
>    <xsl:variable name="grammars">
>        <xsl:copy-of
> select="/wadl:application/wadl:grammars/*[not(namespace-uri()=$wadl-ns)]"/>
>        <xsl:apply-templates
> select="/wadl:application/wadl:grammars/wadl:include[@href]"
> mode="include-grammar"/>
>        <xsl:apply-templates
> select="/wadl:application/wadl:resources/descendant::wadl:resource[@type]"
> mode="include-href"/>
>        <xsl:apply-templates
> select="exsl:node-set($resources)/descendant::wadl:*[@href]"
> mode="include-href"/>
>    </xsl:variable>
> 
>    <xsl:template match="wadl:include[@href]" mode="include-grammar">
>        <xsl:variable name="included" select="document(@href,
> /)/*"></xsl:variable>
>        <xsl:element name="wadl:include">
>            <xsl:attribute name="href"><xsl:value-of
> select="@href"/></xsl:attribute>
>            <xsl:copy-of select="$included"/> <!-- FIXME: xml-schema
> includes, etc -->
>        </xsl:element>
>    </xsl:template>
> 
>    <xsl:template match="wadl:*[@href]" mode="include-href">
>        <xsl:variable name="uri" select="substring-before(@href, '#')"/>
>        <xsl:if test="$uri">
>            <xsl:variable name="included" select="document($uri, /)"/>
>            <xsl:copy-of
> select="$included/wadl:application/wadl:grammars/*[not(namespace-uri()=$wadl-ns)]"/>
>            <xsl:apply-templates
> select="$included/descendant::wadl:include[@href]"
> mode="include-grammar"/>
>            <xsl:apply-templates
> select="$included/wadl:application/wadl:resources/descendant::wadl:resource[@type]"
> mode="include-href"/>
>            <xsl:apply-templates
> select="$included/wadl:application/wadl:resources/descendant::wadl:*[@href]"
> mode="include-href"/>
>        </xsl:if>
>    </xsl:template>
> 
>    <xsl:template match="wadl:resource[@type]" mode="include-href">
>        <xsl:variable name="uri" select="substring-before(@type, '#')"/>
>        <xsl:if test="$uri">
>            <xsl:variable name="included" select="document($uri, /)"/>
>            <xsl:copy-of
> select="$included/wadl:application/wadl:grammars/*[not(namespace-uri()=$wadl-ns)]"/>
>            <xsl:apply-templates
> select="$included/descendant::wadl:include[@href]"
> mode="include-grammar"/>
>            <xsl:apply-templates
> select="$included/wadl:application/wadl:resources/descendant::wadl:resource[@type]"
> mode="include-href"/>
>            <xsl:apply-templates
> select="$included/wadl:application/wadl:resources/descendant::wadl:*[@href]"
> mode="include-href"/>
>        </xsl:if>
>    </xsl:template>
> 
>    <!-- main template -->
> 
>    <xsl:template match="/wadl:application">
>        <html>
>            <head>
>                <title>
>                    <xsl:choose>
>                        <xsl:when test="wadl:doc[@title]">
>                            <xsl:value-of select="wadl:doc[@title][1]/@title"/>
>                        </xsl:when>
>                        <xsl:otherwise>My Web Application</xsl:otherwise>
>                    </xsl:choose>
>                </title>
>                <style type="text/css">
>                    body {
>                        font-family: sans-serif;
>                        font-size: 0.85em;
>                        margin: 2em 8em;
>                    }
>                    .methods {
>                        background-color: #eef;
>                        padding: 1em;
>                    }
>                    h1 {
>                        font-size: 2.5em;
>                    }
>                    h2 {
>                        border-bottom: 1px solid black;
>                        margin-top: 1em;
>                        margin-bottom: 0.5em;
>                        font-size: 2em;
>                       }
>                    h3 {
>                        color: orange;
>                        font-size: 1.75em;
>                        margin-top: 1.25em;
>                        margin-bottom: 0em;
>                    }
>                    h4 {
>                        margin: 0em;
>                        padding: 0em;
>                        border-bottom: 2px solid white;
>                    }
>                    h6 {
>                        font-size: 1.1em;
>                        color: #99a;
>                        margin: 0.5em 0em 0.25em 0em;
>                    }
>                    dd {
>                        margin-left: 1em;
>                    }
>                    tt {
>                        font-size: 1.2em;
>                    }
>                    table {
>                        margin-bottom: 0.5em;
>                    }
>                    th {
>                        text-align: left;
>                        font-weight: normal;
>                        color: black;
>                        border-bottom: 1px solid black;
>                        padding: 3px 6px;
>                    }
>                    td {
>                        padding: 3px 6px;
>                        vertical-align: top;
>                        background-color: f6f6ff;
>                        font-size: 0.85em;
>                    }
>                    td p {
>                        margin: 0px;
>                    }
>                    ul {
>                        padding-left: 1.75em;
>                    }
>                    p + ul, p + ol, p + dl {
>                        margin-top: 0em;
>                    }
>                    .optional {
>                        font-weight: normal;
>                        opacity: 0.75;
>                    }
>                </style>
>            </head>
>            <body>
>                <h1>
>                    <xsl:choose>
>                        <xsl:when test="wadl:doc[@title]">
>                            <xsl:value-of select="wadl:doc[@title][1]/@title"/>
>                        </xsl:when>
>                        <xsl:otherwise>My Web Application</xsl:otherwise>
>                    </xsl:choose>
>                </h1>
>                <xsl:apply-templates select="wadl:doc"/>
>                <ul>
>                    <li><a href="#resources">Resources</a>
>                        <xsl:apply-templates
> select="exsl:node-set($resources)" mode="toc"/>
>                    </li>
>                    <li><a href="#representations">Representations</a>
>                        <ul>
>                            <xsl:apply-templates
> select="exsl:node-set($resources)/descendant::wadl:representation"
> mode="toc"/>
>                        </ul>
>                    </li>
>                </ul>
>                <h2 id="resources">Resources</h2>
>                <xsl:apply-templates
> select="exsl:node-set($resources)" mode="list"/>
>                <h2 id="representations">Representations</h2>
>                <xsl:apply-templates
> select="exsl:node-set($resources)/descendant::wadl:representation"
> mode="list"/>
> 
>            </body>
>        </html>
>    </xsl:template>
> 
>    <!-- Table of Contents -->
> 
>    <xsl:template match="wadl:resources" mode="toc">
>        <xsl:variable name="base">
>            <xsl:choose>
>                <xsl:when test="substring(@base, string-length(@base),
> 1) = '/'">
>                    <xsl:value-of select="substring(@base, 1,
> string-length(@base) - 1)"/>
>                </xsl:when>
>                <xsl:otherwise><xsl:value-of select="@base"/></xsl:otherwise>
>            </xsl:choose>
>        </xsl:variable>
>        <ul>
>            <xsl:apply-templates select="wadl:resource" mode="toc">
>                <xsl:with-param name="context"><xsl:value-of
> select="$base"/></xsl:with-param>
>            </xsl:apply-templates>
>        </ul>
>    </xsl:template>
> 
>    <xsl:template match="wadl:resource" mode="toc">
>        <xsl:param name="context"/>
>        <xsl:variable name="id"><xsl:call-template
> name="get-id"/></xsl:variable>
>        <xsl:variable name="name"><xsl:value-of
> select="$context"/>/<xsl:value-of select="@path"/></xsl:variable>
>        <li><a href="#{$id}"><xsl:value-of select="$name"/></a>
>        <xsl:if test="wadl:resource">
>            <ul>
>                <xsl:apply-templates select="wadl:resource" mode="toc">
>                    <xsl:with-param name="context" select="$name"/>
>                </xsl:apply-templates>
>            </ul>
>        </xsl:if>
>        </li>
>    </xsl:template>
> 
>    <xsl:template match="wadl:representation" mode="toc">
>        <xsl:variable name="id"><xsl:call-template
> name="get-id"/></xsl:variable>
>        <xsl:variable name="href" select="@id"/>
>        <xsl:choose>
>            <xsl:when test="preceding::wadl:*[@id=$href]"/>
>            <xsl:otherwise>
>                <li>
>                    <a href="#{$id}">
>                        <xsl:call-template name="representation-name"/>
>                    </a>
>                </li>
>            </xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <!-- Listings -->
> 
>    <xsl:template match="wadl:resources" mode="list">
>        <xsl:variable name="base">
>            <xsl:choose>
>                <xsl:when test="substring(@base, string-length(@base),
> 1) = '/'">
>                    <xsl:value-of select="substring(@base, 1,
> string-length(@base) - 1)"/>
>                </xsl:when>
>                <xsl:otherwise><xsl:value-of select="@base"/></xsl:otherwise>
>            </xsl:choose>
>        </xsl:variable>
>        <xsl:apply-templates select="wadl:resource" mode="list"/>
> 
>    </xsl:template>
> 
>    <xsl:template match="wadl:resource" mode="list">
>        <xsl:param name="context"/>
>        <xsl:variable name="href" select="@id"/>
>        <xsl:choose>
>            <xsl:when test="preceding::wadl:resource[@id=$href]"/>
>            <xsl:otherwise>
>                <xsl:variable name="id"><xsl:call-template
> name="get-id"/></xsl:variable>
>                <xsl:variable name="name">
>                    <xsl:value-of select="$context"/>/<xsl:value-of
> select="@path"/>
>                    <xsl:for-each select="wadl:param[@style='matrix']">
>                        <span class="optional">;<xsl:value-of
> select="@name"/>=...</span>
>                    </xsl:for-each>
>                </xsl:variable>
>                <div class="resource">
>                    <h3 id="{$id}">
>                        <xsl:choose>
>                            <xsl:when
> test="wadl:doc[@title]"><xsl:value-of
> select="wadl:doc[@title][1]/@title"/></xsl:when>
>                            <xsl:otherwise>
>                                <xsl:copy-of select="$name"/>
>                                <xsl:for-each
> select="wadl:method[1]/wadl:request/wadl:param[@style='query']">
>                                    <xsl:choose>
>                                        <xsl:when test="@required='true'">
>                                            <xsl:choose>
>                                                <xsl:when
> test="preceding-sibling::wadl:param[@style='query']">&amp;</xsl:when>
>                                                <xsl:otherwise>?</xsl:otherwise>
>                                            </xsl:choose>
>                                            <xsl:value-of select="@name"/>
>                                        </xsl:when>
>                                        <xsl:otherwise>
>                                            <span class="optional">
>                                                <xsl:choose>
>                                                    <xsl:when
> test="preceding-sibling::wadl:param[@style='query']">&amp;</xsl:when>
> 
> <xsl:otherwise>?</xsl:otherwise>
>                                                </xsl:choose>
>                                                <xsl:value-of select="@name"/>
>                                            </span>
>                                        </xsl:otherwise>
>                                    </xsl:choose>
>                                </xsl:for-each>
>                            </xsl:otherwise>
>                        </xsl:choose>
> 
>                    </h3>
>                    <xsl:apply-templates select="wadl:doc"/>
>                    <xsl:apply-templates select="." mode="param-group">
>                        <xsl:with-param
> name="prefix">resource-wide</xsl:with-param>
>                        <xsl:with-param name="style">template</xsl:with-param>
>                    </xsl:apply-templates>
>                    <xsl:apply-templates select="."
> mode="param-group">
>                        <xsl:with-param
> name="prefix">resource-wide</xsl:with-param>
>                        <xsl:with-param name="style">matrix</xsl:with-param>
>                    </xsl:apply-templates>
>                    <h6>Methods</h6>
>                    <div class="methods">
>                        <xsl:apply-templates select="wadl:method"/>
>                    </div>
>                </div>
>                <xsl:apply-templates select="wadl:resource" mode="list">
>                    <xsl:with-param name="context" select="$name"/>
>                </xsl:apply-templates>
>            </xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <xsl:template match="wadl:method">
>        <xsl:variable name="id"><xsl:call-template
> name="get-id"/></xsl:variable>
>        <div class="method">
>            <h4 id="{$id}"><xsl:value-of select="@name"/></h4>
>            <xsl:apply-templates select="wadl:doc"/>
>            <xsl:apply-templates select="wadl:request"/>
>            <xsl:apply-templates select="wadl:response"/>
>        </div>
>    </xsl:template>
> 
>    <xsl:template match="wadl:request">
>        <xsl:apply-templates select="." mode="param-group">
>            <xsl:with-param name="prefix">request</xsl:with-param>
>            <xsl:with-param name="style">query</xsl:with-param>
>        </xsl:apply-templates>
>        <xsl:apply-templates select="." mode="param-group">
>            <xsl:with-param name="prefix">request</xsl:with-param>
>            <xsl:with-param name="style">header</xsl:with-param>
>        </xsl:apply-templates>
>        <xsl:if test="wadl:representation">
>            <p><em>acceptable request representations:</em></p>
>            <ul>
>                <xsl:apply-templates select="wadl:representation"/>
>            </ul>
>        </xsl:if>
>    </xsl:template>
> 
>    <xsl:template match="wadl:response">
>        <xsl:apply-templates select="." mode="param-group">
>            <xsl:with-param name="prefix">response</xsl:with-param>
>            <xsl:with-param name="style">header</xsl:with-param>
>        </xsl:apply-templates>
>        <xsl:if test="wadl:representation">
>            <p><em>available response representations:</em></p>
>            <ul>
>                <xsl:apply-templates select="wadl:representation"/>
>            </ul>
>        </xsl:if>
>    </xsl:template>
> 
>    <xsl:template match="wadl:representation">
>        <xsl:variable name="id"><xsl:call-template
> name="get-id"/></xsl:variable>
>        <li>
>            <a href="#{$id}">
>                <xsl:call-template name="representation-name"/>
>            </a>
>        </li>
>    </xsl:template>
> 
>    <xsl:template match="wadl:representation" mode="list">
>        <xsl:variable name="id"><xsl:call-template
> name="get-id"/></xsl:variable>
>        <xsl:variable name="href" select="@id"/>
>        <xsl:variable name="expanded-name">
>            <xsl:call-template name="expand-qname">
>                <xsl:with-param select="@element" name="qname"/>
>            </xsl:call-template>
>        </xsl:variable>
>        <xsl:choose>
>            <xsl:when test="preceding::wadl:*[@id=$href]"/>
>            <xsl:otherwise>
>                <h3 id="{$id}">
>                    <xsl:call-template name="representation-name"/>
>                </h3>
>                <xsl:apply-templates select="wadl:doc"/>
>                <xsl:if test="@element or wadl:param">
>                    <div class="representation">
>                        <xsl:if test="@element">
>                            <h6>XML Schema</h6>
>                            <xsl:call-template name="get-element">
>                                <xsl:with-param name="context" select="."/>
>                                <xsl:with-param name="qname" select="@element"/>
>                            </xsl:call-template>
>                        </xsl:if>
>                        <xsl:apply-templates select="." mode="param-group">
>                            <xsl:with-param name="style">plain</xsl:with-param>
>                        </xsl:apply-templates>
>                        <xsl:apply-templates select="." mode="param-group">
>                            <xsl:with-param name="style">header</xsl:with-param>
>                        </xsl:apply-templates>
>                    </div>
>                </xsl:if>
>            </xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <xsl:template match="wadl:*" mode="param-group">
>        <xsl:param name="style"/>
>        <xsl:param name="prefix"></xsl:param>
>        <xsl:if test="ancestor-or-self::wadl:*/wadl:param[@style=$style]">
>        <h6><xsl:value-of select="$prefix"/><xsl:text>
> </xsl:text><xsl:value-of select="$style"/> parameters</h6>
>        <table>
>            <tr>
>                <th>parameter</th>
>                <th>value</th>
>                <th>description</th>
>           </tr>
>            <xsl:apply-templates
> select="ancestor-or-self::wadl:*/wadl:param[@style=$style]"/>
>        </table>
>        </xsl:if>
>    </xsl:template>
> 
>    <xsl:template match="wadl:param">
>        <tr>
>            <td>
>                <p><strong><xsl:value-of select="@name"/></strong></p>
>            </td>
>            <td>
>                <p>
>                <em><xsl:call-template
> name="link-qname"><xsl:with-param name="qname"
> select="@type"/></xsl:call-template></em>
>                    <xsl:if test="@required='true'"> <small>
> (required)</small></xsl:if>
>                    <xsl:if test="@repeating='true'"> <small>
> (repeating)</small></xsl:if>
>                </p>
>                <xsl:choose>
>                    <xsl:when test="wadl:option">
>                        <p><em>One of:</em></p>
>                        <ul>
>                            <xsl:apply-templates select="wadl:option"/>
>                        </ul>
>                    </xsl:when>
>                    <xsl:otherwise>
>                        <xsl:if test="@default"><p>Default:
> <tt><xsl:value-of select="@default"/></tt></p></xsl:if>
>                        <xsl:if test="@fixed"><p>Fixed:
> <tt><xsl:value-of select="@fixed"/></tt></p></xsl:if>
>                    </xsl:otherwise>
>                </xsl:choose>
>            </td>
>            <td>
>                <xsl:apply-templates select="wadl:doc"/>
>                <xsl:if test="wadl:option[wadl:doc]">
>                    <dl>
>                        <xsl:apply-templates select="wadl:option"
> mode="option-doc"/>
>                    </dl>
>                </xsl:if>
>                <xsl:if test="@path">
>                    <ul>
>                        <li>XPath to value: <tt><xsl:value-of
> select="@path"/></tt></li>
>                        <xsl:apply-templates select="wadl:link"/>
>                    </ul>
>                </xsl:if>
>            </td>
>        </tr>
>    </xsl:template>
> 
>    <xsl:template match="wadl:link">
>        <li>
>            Link: <a href="#{@resource_type}"><xsl:value-of
> select="@rel"/></a>
>        </li>
>    </xsl:template>
> 
>    <xsl:template match="wadl:option">
>        <li>
>            <tt><xsl:value-of select="@value"/></tt>
>            <xsl:if test="ancestor::wadl:param[1]/@default=@value">
> <small> (default)</small></xsl:if>
>        </li>
>    </xsl:template>
> 
>    <xsl:template match="wadl:option" mode="option-doc">
>            <dt>
>                <tt><xsl:value-of select="@value"/></tt>
>                <xsl:if
> test="ancestor::wadl:param[1]/@default=@value"> <small>
> (default)</small></xsl:if>
>            </dt>
>            <dd>
>                <xsl:apply-templates select="wadl:doc"/>
>            </dd>
>    </xsl:template>
> 
>    <xsl:template match="wadl:doc">
>        <xsl:param name="inline">0</xsl:param>
>        <!-- skip WADL elements -->
>        <xsl:choose>
>            <xsl:when test="node()[1]=text() and $inline=0">
>                <p>
>                    <xsl:apply-templates select="node()" mode="copy"/>
>                </p>
>            </xsl:when>
>            <xsl:otherwise>
>                <xsl:apply-templates select="node()" mode="copy"/>
>            </xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <!-- utilities -->
> 
>    <xsl:template name="get-id">
>        <xsl:choose>
>            <xsl:when test="@id"><xsl:value-of select="@id"/></xsl:when>
>            <xsl:otherwise><xsl:value-of
> select="generate-id()"/></xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <xsl:template name="get-namespace-uri">
>        <xsl:param name="context" select="."/>
>        <xsl:param name="qname"/>
>        <xsl:variable name="prefix" select="substring-before($qname,':')"/>
>        <xsl:variable name="qname-ns-uri"
> select="$context/namespace::*[name()=$prefix]"/>
>        <!-- nasty hack to get around libxsl's refusal to copy all
> namespace nodes when pushing nodesets around -->
>        <xsl:choose>
>            <xsl:when test="$qname-ns-uri">
>                <xsl:value-of select="$qname-ns-uri"/>
>            </xsl:when>
>            <xsl:otherwise>
>                <xsl:value-of
> select="exsl:node-set($resources)/*[1]/attribute::*[namespace-uri()='urn:namespace'
> and local-name()=$prefix]"/>
>            </xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <xsl:template name="get-element">
>        <xsl:param name="context" select="."/>
>        <xsl:param name="qname"/>
>        <xsl:variable name="ns-uri">
>            <xsl:call-template name="get-namespace-uri">
>                <xsl:with-param name="context" select="$context"/>
>                <xsl:with-param name="qname" select="$qname"/>
>            </xsl:call-template>
>        </xsl:variable>
>        <xsl:variable name="localname" select="substring-after($qname, ':')"/>
>        <xsl:variable name="definition"
> select="exsl:node-set($grammars)/descendant::xs:element[@name=$localname][ancestor-or-self::*[@targetNamespace=$ns-uri]]"/>
>        <xsl:variable name='source'
> select="$definition/ancestor-or-self::wadl:include[1]/@href"/>
>        <p><em>Source: <a href="{$source}"><xsl:value-of
> select="$source"/></a></em></p>
>        <pre><xsl:apply-templates select="$definition" mode="encode"/></pre>
>    </xsl:template>
> 
>    <xsl:template name="link-qname">
>        <xsl:param name="context" select="."/>
>        <xsl:param name="qname"/>
>        <xsl:variable name="ns-uri">
>            <xsl:call-template name="get-namespace-uri">
>                <xsl:with-param name="context" select="$context"/>
>                <xsl:with-param name="qname" select="$qname"/>
>            </xsl:call-template>
>        </xsl:variable>
>        <xsl:variable name="localname" select="substring-after($qname, ':')"/>
>        <xsl:choose>
>            <xsl:when test="$ns-uri='http://www.w3.org/2001/XMLSchema'">
>                <a
> href="http://www.w3.org/TR/xmlschema-2/#{$localname}"><xsl:value-of
> select="$localname"/></a>
>            </xsl:when>
>            <xsl:otherwise>
>                <xsl:variable name="definition"
> select="exsl:node-set($grammars)/descendant::xs:*[@name=$localname][ancestor-or-self::*[@targetNamespace=$ns-uri]]"/>
>                <a
> href="{$definition/ancestor-or-self::wadl:include[1]/@href}"
> title="{$definition/descendant::xs:documentation/descendant::text()}"><xsl:value-of
> select="$localname"/></a>
>            </xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <xsl:template name="expand-qname">
>        <xsl:param name="context" select="."/>
>        <xsl:param name="qname"/>
>        <xsl:variable name="ns-uri">
>            <xsl:call-template name="get-namespace-uri">
>                <xsl:with-param name="context" select="$context"/>
>                <xsl:with-param name="qname" select="$qname"/>
>            </xsl:call-template>
>        </xsl:variable>
>        <xsl:text>{</xsl:text>
>        <xsl:value-of select="$ns-uri"/>
>        <xsl:text>} </xsl:text>
>        <xsl:value-of select="substring-after($qname, ':')"/>
>    </xsl:template>
> 
> 
>    <xsl:template name="representation-name">
>        <xsl:variable name="expanded-name">
>            <xsl:call-template name="expand-qname">
>                <xsl:with-param select="@element" name="qname"/>
>            </xsl:call-template>
>        </xsl:variable>
>        <xsl:choose>
>            <xsl:when test="wadl:doc[@title]">
>                <xsl:value-of select="wadl:doc[@title][1]/@title"/>
>                <xsl:if test="@status or @mediaType or @element"> (</xsl:if>
>                <xsl:if test="@status">Status Code
> </xsl:if><xsl:value-of select="@status"/>
>                <xsl:if test="@status and @mediaType"> - </xsl:if>
>                <xsl:value-of select="@mediaType"/>
>                <xsl:if test="(@status or @mediaType) and @element"> - </xsl:if>
>                <xsl:if test="@element">
>                    <abbr title="{$expanded-name}"><xsl:value-of
> select="@element"/></abbr>
>                </xsl:if>
>                <xsl:if test="@status or @mediaType or @element">)</xsl:if>
>            </xsl:when>
>            <xsl:otherwise>
>                <xsl:if test="@status">Status Code
> </xsl:if><xsl:value-of select="@status"/>
>                <xsl:if test="@status and @mediaType"> - </xsl:if>
>                <xsl:value-of select="@mediaType"/>
>                <xsl:if test="@element"> (</xsl:if>
>                <abbr title="{$expanded-name}"><xsl:value-of
> select="@element"/></abbr>
>                <xsl:if test="@element">)</xsl:if>
>            </xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <!-- entity-encode markup for display -->
> 
>    <xsl:template match="*" mode="encode">
>        <xsl:text>&lt;</xsl:text>
>        <xsl:value-of select="name()"/><xsl:apply-templates
> select="attribute::*" mode="encode"/>
>        <xsl:choose>
>            <xsl:when test="*|text()">
>                <xsl:text>&gt;</xsl:text>
>                <xsl:apply-templates select="*|text()" mode="encode"
> xml:space="preserve"/>
>                <xsl:text>&lt;/</xsl:text><xsl:value-of
> select="name()"/><xsl:text>&gt;</xsl:text>
>            </xsl:when>
>            <xsl:otherwise>
>                <xsl:text>/&gt;</xsl:text>
>            </xsl:otherwise>
>        </xsl:choose>
>    </xsl:template>
> 
>    <xsl:template match="@*" mode="encode">
>        <xsl:text> </xsl:text><xsl:value-of
> select="name()"/><xsl:text>="</xsl:text><xsl:value-of
> select="."/><xsl:text>"</xsl:text>
>    </xsl:template>
> 
>    <xsl:template match="text()" mode="encode">
>        <xsl:value-of select="." xml:space="preserve"/>
>    </xsl:template>
> 
>    <!-- copy HTML for display -->
> 
>    <xsl:template match="html:*" mode="copy">
>        <!-- remove the prefix on HTML elements -->
>        <xsl:element name="{local-name()}">
>            <xsl:for-each select="@*">
>                <xsl:attribute name="{local-name()}"><xsl:value-of
> select="."/></xsl:attribute>
>            </xsl:for-each>
>            <xsl:apply-templates select="node()" mode="copy"/>
>        </xsl:element>
>    </xsl:template>
> 
>    <xsl:template
> match="@*|node()[namespace-uri()!='http://www.w3.org/1999/xhtml']"
> mode="copy">
>        <!-- everything else goes straight through -->
>        <xsl:copy>
>            <xsl:apply-templates select="@*|node()" mode="copy"/>
>        </xsl:copy>
>    </xsl:template>
> 
> </xsl:stylesheet>
> 
> 

Received on Tuesday, 19 January 2010 14:53:24 UTC