<!DOCTYPE xsl:stylesheet [ <!–* <!DOCTYPE xsl:stylesheet PUBLIC 'www.w3.org/1999/XSL/Transform'
'../../People/cmsmcq/lib/xslt10.dtd' [
*–> <!ATTLIST xsl:stylesheet
xmlns:xsl CDATA "http://www.w3.org/1999/XSL/Transform" xmlns:xsd CDATA #IMPLIED xmlns:xhtml CDATA #IMPLIED
> <!ATTLIST xsl:text
xmlns:xsl CDATA "http://www.w3.org/1999/XSL/Transform"
>
<!ENTITY copy “©” ><!–=copyright sign–> <!ENTITY reg “®” ><!–/circledR =registered sign–> <!ENTITY rarr “→” ><!–/rightarrow /to A: =rightward arrow–>
<!ENTITY nl “
”> <!ENTITY lsquo “‘” ><!–=single quotation mark, left–> <!ENTITY rsquo “’” ><!–=single quotation mark, right–> <!ENTITY ldquo ““” ><!–=double quotation mark, left–> <!ENTITY rdquo “”” ><!–=double quotation mark, right–>
]> <xsl:stylesheet version=“1.0”
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xhtml="http://www.w3.org/1999/xhtml"
>
<!--* xsd.xsl: format an XSD schema document for simple display in a Web browser. * http://www.w3.org/XML/2004/xml-schema-test-suite/xsd.xsl * * Copyright © 2008-2009 World Wide Web Consortium, (Massachusetts * Institute of Technology, European Research Consortium for * Informatics and Mathematics, Keio University). All Rights * Reserved. This work is distributed under the W3C® Software * License [1] in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. * * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231 * *--> <!--* Revisions: * 2012-05-03 : CMSMcQ : reissue under Software License, not document * license * 2009-01-21 : CMSMcQ : wrap start-tags only when necessary * 2009-01-20 : CMSMcQ : wrap start-tags * 2008-12-19 : CMSMcQ : add toc for schema documents with more than * five children of xsd:schema * 2008-12-18 : CMSMcQ : fix problems with text breaking * add rule for top-level attribute groups * 2008-09-27 : CMSMcQ : made first version of this stylesheet *--> <xsl:output method="html" indent="yes"/> <xsl:param name="line-wrap-length" select="60"/> <xsl:param name="ind-depth" select="6"/> <xsl:param name="additional-indent" select="substring( ' ', 1,$ind-depth)"/> <xsl:variable name="tns"> <xsl:value-of select="/xsd:schema/@targetNamespace"/> </xsl:variable> <!--* 0 Document root *--> <xsl:template match="/"> <xsl:variable name="doctitle"> <xsl:text>Schema document for </xsl:text> <xsl:choose> <xsl:when test="xsd:schema/@targetNamespace"> <xsl:text>namespace </xsl:text> <xsl:value-of select="$tns"/> </xsl:when> <xsl:otherwise> <xsl:text>unspecified namespace</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:variable name="docHasHeading" select=" xsd:schema/xsd:annotation[1]/xsd:documentation/*[1] [self::xhtml:h1 or self::h1] or xsd:schema/xsd:annotation[1]/xsd:documentation/xhtml:div/*[1] [self::xhtml:h1 or self::h1] "/> <xsl:variable name="docIsProlific" select=" count(xsd:schema/child::*) > 5 "/> <xsl:element name="html"> <xsl:element name="head"> <xsl:element name="title"> <xsl:value-of select="$doctitle"/> </xsl:element> <xsl:element name="style"> <xsl:attribute name="type">text/css</xsl:attribute> .bodytext .bodytext { margin-left: 0; margin-right: 0; } .bodytext { margin-left: 15%; margin-right: 2%; } .annotation { <!--* anything special to do here? *--> <!--* color: navy; *--> } .same-ns { color: Green; } .diff-ns { color: maroon; } .warning { color: red; } p.note { font-style: italic; } p.dt { font-weight: bold; } span.rfc { font-variant: small-caps; } </xsl:element> </xsl:element> <xsl:element name="body"> <xsl:choose> <xsl:when test="$docHasHeading and not($docIsProlific)"> <!--* If the first thing in the first documentation element is a heading, * and there are few children, then don't interfere. *--> <xsl:comment>* <xsl:value-of select="$doctitle"/> *</xsl:comment> </xsl:when> <xsl:otherwise> <!--* either document has no heading (and needs one), or * we're going to do a toc and need a heading anyway *--> <xsl:element name="h1"> <xsl:value-of select="$doctitle"/> </xsl:element> <xsl:if test="$docIsProlific"> <xsl:element name="div"> <xsl:element name="hr"/> <xsl:element name="ul"> <xsl:attribute name="class">bodytext</xsl:attribute> <xsl:apply-templates mode="toc" select="./xsd:schema/*"/> </xsl:element> <xsl:element name="hr"/> </xsl:element> </xsl:if> </xsl:otherwise> </xsl:choose> <xsl:apply-templates/> </xsl:element> </xsl:element> </xsl:template> <!--* 2 Schema element *--> <xsl:template match="xsd:schema"> <!--* optional future change: write out information here about * the attributes of xsd:schema: version, finalDefault, blockDefault, * elementFormDefault, atgtributeFormDefault, namespace bindings ... *--> <xsl:apply-templates/> </xsl:template> <!--* 3 Anotation *--> <xsl:template match="xsd:annotation"> <xsl:element name="div"> <xsl:attribute name="class">annotation</xsl:attribute> <xsl:attribute name="id"> <xsl:call-template name="leid"> </xsl:call-template> </xsl:attribute> <xsl:if test="not(./xsd:documentation//*[@class='bodytext'])"> <xsl:element name="h3">Annotation</xsl:element> </xsl:if> <xsl:element name="div"> <xsl:choose> <xsl:when test="./xsd:documentation//*[@class='bodytext']"> <!--* if the schema document is already using class=bodytext, * let the schema author control the margins, don't * assign the class here. *--> </xsl:when> <xsl:otherwise> <xsl:attribute name="class">bodytext</xsl:attribute> </xsl:otherwise> </xsl:choose> <xsl:apply-templates/> </xsl:element> </xsl:element> </xsl:template> <xsl:template match="xsd:documentation"> <xsl:choose> <xsl:when test=".//xhtml:* or .//div or .//p or .//li"> <xsl:copy-of select="*"/> </xsl:when> <xsl:when test="./*"> <xsl:message>! Unrecognized children in xs:documentation element</xsl:message> <xsl:copy-of select="*"/> </xsl:when> <xsl:otherwise> <xsl:call-template name="break-pcdata"> <xsl:with-param name="s" select="string(.)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="break-pcdata"> <xsl:param name="s"></xsl:param> <xsl:choose> <xsl:when test="starts-with($s,'
')"> <xsl:text>
</xsl:text> <xsl:element name="br"/> <xsl:call-template name="break-pcdata"> <xsl:with-param name="s" select="substring($s,2)"/> </xsl:call-template> </xsl:when> <xsl:when test="starts-with($s,' ')"> <xsl:text> </xsl:text> <xsl:call-template name="break-pcdata"> <xsl:with-param name="s" select="substring($s,2)"/> </xsl:call-template> </xsl:when> <xsl:when test="contains($s,'
')"> <xsl:value-of select="substring-before($s,'
')"/> <xsl:text>
</xsl:text> <xsl:element name="br"/> <xsl:call-template name="break-pcdata"> <xsl:with-param name="s" select="substring-after($s,'
')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$s"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!--* 4 Top-level components *--> <xsl:template match=" xsd:schema/xsd:attribute | xsd:schema/xsd:element | xsd:schema/xsd:simpleType | xsd:schema/xsd:complexType | xsd:schema/xsd:attributeGroup | xsd:schema/xsd:import | xsd:schema/xsd:group | xsd:schema/xsd:notation "> <xsl:call-template name="show-top-level-component"/> </xsl:template> <xsl:template name="show-top-level-component"> <xsl:variable name="sort"> <xsl:call-template name="sort"/> </xsl:variable> <xsl:variable name="leid"> <xsl:call-template name="leid"/> </xsl:variable> <xsl:variable name="has-heading-already"> <xsl:choose> <xsl:when test="./xsd:annotation[1]/xsd:documentation/*//* [self::xhtml:*[starts-with(local-name(),'h')] or self::*[contains(' h1 h2 h3 h4 h5 ',local-name())] ]"> <xsl:value-of select="'true'"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="'false'"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:element name="div"> <xsl:attribute name="id"> <xsl:value-of select="$leid"/> </xsl:attribute> <xsl:element name="h3"> <xsl:element name="a"> <xsl:attribute name="name"> <xsl:value-of select="$leid"/> </xsl:attribute> <xsl:value-of select="concat($sort,' ')"/> <xsl:choose> <xsl:when test="count(@name) = 1"> <xsl:element name="em"> <xsl:value-of select="@name"/> </xsl:element> </xsl:when> <xsl:when test="self::xsd:import and (count(@namespace) = 1)"> <xsl:element name="code"> <xsl:value-of select="@namespace"/> </xsl:element> </xsl:when> </xsl:choose> </xsl:element> </xsl:element> <xsl:element name="div"> <xsl:attribute name="class">bodytext</xsl:attribute> <xsl:if test="./xsd:annotation/xsd:documentation"> <xsl:element name="div"> <xsl:if test="$has-heading-already = 'false'"> <xsl:element name="h4">Notes</xsl:element> </xsl:if><!-- /if .$has-heading-already *--> <xsl:apply-templates select="xsd:annotation/xsd:documentation"/> <xsl:if test="count(./xsd:annotation/xsd:documentation/@source) = 1"> <xsl:element name="p"> <xsl:text>External documentation at </xsl:text> <xsl:element name="code"> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="./xsd:annotation/xsd:documentation/@source"/> </xsl:attribute> <xsl:value-of select="./xsd:annotation/xsd:documentation/@source"/> </xsl:element> </xsl:element> </xsl:element> </xsl:if> </xsl:element> </xsl:if><!-- /if ./xsd:annotation/xsd:documentation *--> <xsl:element name="div"> <xsl:element name="h4">Formal declaration in XSD source form</xsl:element> <xsl:element name="pre"> <xsl:variable name="preceding-node" select="./preceding-sibling::node()[1]"/> <xsl:if test="not($preceding-node/self::*) and (normalize-space($preceding-node) = '')"> <xsl:value-of select="$preceding-node"/> </xsl:if> <xsl:apply-templates select="." mode="echo-xml"/> </xsl:element> </xsl:element><!--* div for XSD source form *--> </xsl:element><!--* div for documentation and formal description *--> </xsl:element><!--* div for top-level component *--> </xsl:template> <!--* 5 xml mode *--> <xsl:template match="*" mode="echo-xml"> <xsl:variable name="s0"> <xsl:call-template name="lastline-suffix"> <xsl:with-param name="s0" select="preceding-sibling::text() [string-length(.) > 0][1]" /> </xsl:call-template> </xsl:variable> <xsl:variable name="width"> <xsl:call-template name="stag-width"> <xsl:with-param name="indent-length" select="string-length($s0)"/> </xsl:call-template> </xsl:variable> <!--* <xsl:message>Start-tag width for <xsl:value-of select="name()"/> = <xsl:value-of select="$width"/></xsl:message> *--> <xsl:text><</xsl:text> <xsl:value-of select="name()"/> <xsl:apply-templates select="@*" mode="echo-xml"> <xsl:with-param name="break-or-nobreak"> <xsl:choose> <xsl:when test="$width > $line-wrap-length">break</xsl:when> <xsl:otherwise>nobreak</xsl:otherwise> </xsl:choose> </xsl:with-param> <xsl:with-param name="s0"> <xsl:call-template name="lastline-suffix"> <xsl:with-param name="s0" select="preceding-sibling::text() [string-length(.) > 0][1]" /> </xsl:call-template> </xsl:with-param> </xsl:apply-templates> <xsl:choose> <xsl:when test="child::node()"> <xsl:text>></xsl:text> <xsl:apply-templates select="node()" mode="echo-xml"/> <xsl:text></</xsl:text> <xsl:value-of select="name()"/> <xsl:text>></xsl:text> </xsl:when> <xsl:otherwise>/></xsl:otherwise> </xsl:choose> <!--* </xsl:element> *--> </xsl:template> <xsl:template match="xsd:annotation" mode="echo-xml"/> <xsl:template match="@xml:space" mode="echo-xml"/> <xsl:template match="@*" mode="echo-xml"> <xsl:param name="break-or-nobreak">nobreak</xsl:param> <xsl:param name="s0"></xsl:param> <xsl:variable name="indent"> <xsl:choose> <xsl:when test="normalize-space($s0) = ''"> <xsl:value-of select="concat($additional-indent,$s0)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="' '"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="parent::xsd:* and $break-or-nobreak = 'break'"> <xsl:text>
</xsl:text> <xsl:value-of select="$indent"/> </xsl:when> <xsl:otherwise> <xsl:text> </xsl:text> </xsl:otherwise> </xsl:choose> <xsl:value-of select="name()"/> <xsl:text>="</xsl:text> <xsl:choose> <xsl:when test="parent::xsd:element and namespace-uri() = '' and local-name() = 'ref' "> <xsl:call-template name="makelink-maybe"/> </xsl:when> <xsl:when test="parent::xsd:attribute and namespace-uri() = '' and local-name() = 'ref' "> <xsl:call-template name="makelink-maybe"/> </xsl:when> <xsl:when test="parent::xsd:restriction and namespace-uri() = '' and local-name() = 'base' "> <xsl:call-template name="makelink-maybe"/> </xsl:when> <xsl:when test="parent::xsd:extension and namespace-uri() = '' and local-name() = 'base' "> <xsl:call-template name="makelink-maybe"/> </xsl:when> <xsl:when test="parent::xsd:group and namespace-uri() = '' and local-name() = 'ref' "> <xsl:call-template name="makelink-maybe"/> </xsl:when> <xsl:when test="parent::xsd:list and namespace-uri() = '' and local-name() = 'itemType' "> <xsl:call-template name="makelink-maybe"/> </xsl:when> <xsl:when test="parent::xsd:union and namespace-uri() = '' and local-name() = 'memberTypes' "> <xsl:call-template name="makelink-several-maybe"/> </xsl:when> <xsl:when test="parent::xsd:element and namespace-uri() = '' and local-name() = 'type' "> <xsl:call-template name="makelink-maybe"/> </xsl:when> <xsl:when test="parent::xsd:attribute and namespace-uri() = '' and local-name() = 'type' "> <xsl:call-template name="makelink-maybe"/> </xsl:when> <xsl:when test="parent::xsd:element and namespace-uri() = '' and local-name() = 'substitutionGroup' "> <xsl:call-template name="makelink-several-maybe"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> <xsl:text>"</xsl:text> </xsl:template> <xsl:template match="text()" mode="echo-xml"> <xsl:value-of select="."/> </xsl:template> <!--* 6 toc *--> <xsl:template mode="toc" match=" xsd:schema/xsd:annotation | xsd:schema/xsd:attribute | xsd:schema/xsd:element | xsd:schema/xsd:simpleType | xsd:schema/xsd:complexType | xsd:schema/xsd:attributeGroup | xsd:schema/xsd:import | xsd:schema/xsd:group | xsd:schema/xsd:notation "> <xsl:call-template name="toc-entry"/> </xsl:template> <xsl:template name="toc-entry"> <xsl:variable name="sort"> <xsl:call-template name="sort"/> </xsl:variable> <xsl:variable name="leid"> <xsl:call-template name="leid"/> </xsl:variable> <xsl:element name="li"> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="concat('#',$leid)"/> </xsl:attribute> <xsl:choose> <xsl:when test="self::xsd:annotation and ( descendant::xhtml:h1 or descendant::xhtml:h2 or descendant::xhtml:h3 or descendant::h1 or descendant::h2 or descendant::h3) "> <xsl:choose> <xsl:when test="descendant::xhtml:h1"> <xsl:value-of select="descendant::xhtml:h1[1]"/> </xsl:when> <xsl:when test="descendant::h1"> <xsl:value-of select="descendant::h1[1]"/> </xsl:when> <xsl:when test="descendant::xhtml:h2"> <xsl:value-of select="descendant::xhtml:h2[1]"/> </xsl:when> <xsl:when test="descendant::h2"> <xsl:value-of select="descendant::h2[1]"/> </xsl:when> <xsl:when test="descendant::xhtml:h3"> <xsl:value-of select="descendant::xhtml:h3[1]"/> </xsl:when> <xsl:when test="descendant::h3"> <xsl:value-of select="descendant::h3[1]"/> </xsl:when> </xsl:choose> </xsl:when> <xsl:otherwise> <xsl:value-of select="concat($sort,' ')"/> <xsl:choose> <xsl:when test="count(@name) = 1"> <xsl:element name="em"> <xsl:value-of select="@name"/> </xsl:element> </xsl:when> <xsl:when test="self::xsd:annotation"> <xsl:value-of select="1 + count(preceding-sibling::xsd:annotation)"/> </xsl:when> <xsl:when test="self::xsd:import"> <xsl:element name="code"> <xsl:value-of select="@namespace"/> </xsl:element> </xsl:when> <xsl:otherwise> <!--* fake it *--> <xsl:variable name="gi" select="local-name()"/> <xsl:value-of select="1 + count(preceding-sibling::*[local-name() = $gi])"/> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:element> </xsl:element> </xsl:template> <!--* 7 common code for calculating sort and little-endian IDs *--> <xsl:template name="sort"> <xsl:choose> <xsl:when test="self::xsd:annotation"> <xsl:value-of select="'Annotation'"/> </xsl:when> <xsl:when test="self::xsd:attribute"> <xsl:value-of select="'Attribute'"/> </xsl:when> <xsl:when test="self::xsd:element"> <xsl:value-of select="'Element'"/> </xsl:when> <xsl:when test="self::xsd:simpleType"> <xsl:value-of select="'Simple type'"/> </xsl:when> <xsl:when test="self::xsd:complexType"> <xsl:value-of select="'Complex type'"/> </xsl:when> <xsl:when test="self::xsd:attributeGroup"> <xsl:value-of select="'Attribute group'"/> </xsl:when> <xsl:when test="self::xsd:group"> <xsl:value-of select="'Model group'"/> </xsl:when> <xsl:otherwise> <xsl:variable name="gi" select="local-name()"/> <xsl:value-of select="concat( translate(substring($gi,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ'), substring($gi,2) )"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="leid"> <xsl:choose> <xsl:when test="self::xsd:annotation"> <xsl:value-of select="concat('ann_', string(1+count(preceding-sibling::xsd:annotation)))"/> </xsl:when> <xsl:when test="self::xsd:attribute"> <xsl:value-of select="concat('att_',@name)"/> </xsl:when> <xsl:when test="self::xsd:element"> <xsl:value-of select="concat('elem_',@name)"/> </xsl:when> <xsl:when test="self::xsd:simpleType"> <xsl:value-of select="concat('type_',@name)"/> </xsl:when> <xsl:when test="self::xsd:complexType"> <xsl:value-of select="concat('type_',@name)"/> </xsl:when> <xsl:when test="self::xsd:attributeGroup"> <xsl:value-of select="concat('attgrp_',@name)"/> </xsl:when> <xsl:when test="self::xsd:group"> <xsl:value-of select="concat('grp_',@name)"/> </xsl:when> <xsl:when test="self::xsd:import"> <xsl:value-of select="concat('imp_', string(1+count(preceding-sibling::xsd:import)))"/> </xsl:when> <xsl:otherwise> <xsl:choose> <xsl:when test="@name"> <xsl:variable name="sort" select="local-name()"/> <xsl:value-of select="concat($sort,'_',@name)"/> </xsl:when> <xsl:otherwise> <xsl:variable name="sort" select="local-name()"/> <xsl:variable name="pos" select="1 + count(preceding-sibling::*[local-name() = $sort])"/> <xsl:value-of select="concat($sort,'_',$pos)"/> </xsl:otherwise> </xsl:choose> </xsl:otherwise> </xsl:choose> </xsl:template> <!--* 8 unmatched elements (mostly diagnostic for development) *--> <xsl:template match="*|@*"> <xsl:variable name="fqgi"> <xsl:call-template name="fqgi"/> </xsl:variable> <xsl:message>Warning: <xsl:value-of select="$fqgi"/> not matched.</xsl:message> <xsl:element name="div"> <xsl:attribute name="class">warning</xsl:attribute> <xsl:value-of select="concat('<',name(),'>')"/> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> <xsl:value-of select="concat('</',name(),'>')"/> </xsl:element> </xsl:template> <xsl:template name="fqgi" match="*" mode="fqgi"> <xsl:param name="sBuf"/> <xsl:variable name="sCur"> <xsl:choose> <xsl:when test="self::*"> <!--* elements *--> <xsl:value-of select="name()"/> </xsl:when> <xsl:otherwise> <!--* attributes and other riffraff *--> <xsl:value-of select="concat('@',name())"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <!--* <xsl:message>FQGI(<xsl:value-of select="concat($sBuf,',',$sCur)"/>)</xsl:message> *--> <xsl:choose> <xsl:when test="parent::*"> <xsl:apply-templates mode="fqgi" select="parent::*"> <xsl:with-param name="sBuf"> <xsl:value-of select="concat('/',$sCur,$sBuf)"/> </xsl:with-param> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:value-of select="concat('/',$sCur,$sBuf)"/> </xsl:otherwise> </xsl:choose> </xsl:template> <!--* 9 intra-document link calculation, qname manipulation *--> <xsl:template name="makelink-several-maybe"> <xsl:param name="lQNames" select="normalize-space(.)"/> <xsl:choose> <xsl:when test="contains($lQNames,' ')"> <!--* recur *--> <xsl:call-template name="makelink-maybe"> <xsl:with-param name="qn" select="substring-before($lQNames,' ')"/> </xsl:call-template> <xsl:text> </xsl:text> <xsl:call-template name="makelink-several-maybe"> <xsl:with-param name="lQNames" select="substring-after($lQNames,' ')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <!--* base step, no blank so at most one QName *--> <xsl:call-template name="makelink-maybe"> <xsl:with-param name="qn" select="$lQNames"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="makelink-maybe"> <xsl:param name="qn" select="."/> <xsl:param name="refns"> <xsl:call-template name="qname-to-uri"> <xsl:with-param name="qname" select="$qn"/> </xsl:call-template> </xsl:param> <xsl:param name="lname"> <xsl:call-template name="qname-to-ncname"> <xsl:with-param name="qname" select="$qn"/> </xsl:call-template> </xsl:param> <xsl:variable name="linktarget"> <xsl:choose> <xsl:when test="$tns = $refns"> <xsl:choose> <xsl:when test="parent::xsd:element and local-name() = 'ref' and count(/xsd:schema/xsd:element[@name = $lname]) = 1"> <xsl:value-of select="concat('elem_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:element and local-name() = 'substitutionGroup' and count(/xsd:schema/xsd:element[@name = $lname]) = 1"> <xsl:value-of select="concat('elem_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:attribute and local-name() = 'ref' and count(/xsd:schema/xsd:attribute[@name = $lname]) = 1"> <xsl:value-of select="concat('att_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:restriction and count(/xsd:schema/xsd:*[@name = $lname and (self::xsd:simpleType or self::xsd:complexType)]) = 1"> <xsl:value-of select="concat('type_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:extension and count(/xsd:schema/xsd:*[@name = $lname and (self::xsd:simpleType or self::xsd:complexType)]) = 1"> <xsl:value-of select="concat('type_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:element and local-name() = 'type' and count(/xsd:schema/xsd:*[@name = $lname and (self::xsd:simpleType or self::xsd:complexType)]) = 1"> <xsl:value-of select="concat('type_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:attribute and local-name() = 'type' and count(/xsd:schema/xsd:*[@name = $lname and (self::xsd:simpleType or self::xsd:complexType)]) = 1"> <xsl:value-of select="concat('type_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:list and count(/xsd:schema/xsd:*[@name = $lname and (self::xsd:simpleType or self::xsd:complexType)]) = 1"> <xsl:value-of select="concat('type_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:union and count(/xsd:schema/xsd:*[@name = $lname and (self::xsd:simpleType or self::xsd:complexType)]) = 1"> <xsl:value-of select="concat('type_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:group and count(/xsd:schema/xsd:group[@name = $lname]) = 1"> <xsl:value-of select="concat('grp_',$lname)"/> </xsl:when> <xsl:when test="parent::xsd:attributeGroup and count(/xsd:schema/xsd:atributeGroup[@name = $lname]) = 1"> <xsl:value-of select="concat('attgrp_',$lname)"/> </xsl:when> <!--* static links to built-ins could be handled here *--> </xsl:choose> </xsl:when> <xsl:when test="count(ancestor::*/namespace::*) = 0"> <!--* we are either in a no-namespace document in Opera, * or we are in Firefox, without ns support. *--> <xsl:value-of select="'no-ns-support'"/> </xsl:when> <xsl:otherwise> <!--* namespaces did not match, no target *--> <xsl:value-of select="'no-target'"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:choose> <xsl:when test="($linktarget='no-ns-support')"> <xsl:value-of select="$qn"/> </xsl:when> <xsl:when test="($linktarget='no-target' or $linktarget='') and ($tns = $refns)"> <xsl:element name="span"> <xsl:attribute name="class">external-link same-ns</xsl:attribute> <xsl:value-of select="$qn"/> </xsl:element> </xsl:when> <xsl:when test="($linktarget='no-target') and not($tns = $refns)"> <xsl:element name="span"> <xsl:attribute name="class">external-link diff-ns</xsl:attribute> <xsl:value-of select="$qn"/> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:element name="a"> <xsl:attribute name="href"> <xsl:value-of select="concat('#',$linktarget)"/> </xsl:attribute> <xsl:value-of select="$qn"/> </xsl:element> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="qname-to-uri" match="*" mode="qname-to-uri"> <xsl:param name="qname" select="."/> <xsl:variable name="prefix" select="substring-before($qname,':')"/> <xsl:choose> <xsl:when test="(1=1) and ($prefix='xml')"> <!--* we need to special-case 'xml', since * Opera does not provide a ns node for it. *--> <xsl:value-of select="'http://www.w3.org/XML/1998/namespace'"/> </xsl:when> <xsl:when test="self::*"> <!--* we're an element *--> <xsl:value-of select="string(namespace::*[name()=$prefix])"/> </xsl:when> <xsl:otherwise> <!--* we're not an element *--> <xsl:value-of select="string(parent::*/namespace::*[name()=$prefix])"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="qname-to-ncname"> <xsl:param name="qname" select="."/> <xsl:choose> <xsl:when test="contains($qname,':')"> <xsl:value-of select="substring-after($qname,':')"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$qname"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="lastline-suffix"> <xsl:param name="s0"></xsl:param> <xsl:choose> <xsl:when test="contains($s0,'
')"> <xsl:call-template name="lastline-suffix"> <xsl:with-param name="s0" select="substring-after($s0,'
')"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$s0"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="stag-width"> <xsl:param name="indent-length" select="0"/> <xsl:variable name="attcount" select="count(@*)"/> <xsl:variable name="list-attname-lengths"> <xsl:call-template name="make-length-list"> <xsl:with-param name="kw">attnames</xsl:with-param> </xsl:call-template> </xsl:variable> <xsl:variable name="list-attval-lengths"> <xsl:call-template name="make-length-list"> <xsl:with-param name="kw">attvals</xsl:with-param> </xsl:call-template> </xsl:variable> <xsl:variable name="sum-att-lengths"> <xsl:call-template name="sum-list"> <xsl:with-param name="s0" select="concat($list-attname-lengths,' ',$list-attval-lengths)"/> </xsl:call-template> </xsl:variable> <!--* <xsl:message>indent-length = <xsl:value-of select="$indent-length"/></xsl:message> <xsl:message>attcount = <xsl:value-of select="$attcount"/></xsl:message> <xsl:message>sum-att-lengths = <xsl:value-of select="$sum-att-lengths"/></xsl:message> <xsl:message>namelen = <xsl:value-of select="string-length(name())"/></xsl:message> *--> <xsl:value-of select="$indent-length + (4 * $attcount) + $sum-att-lengths + string-length(name()) + 3"/> </xsl:template> <xsl:template name="make-length-list"> <xsl:param name="kw">unknown</xsl:param> <xsl:choose> <xsl:when test="$kw = 'attnames'"> <xsl:apply-templates select="@*" mode="attnamelength"/> </xsl:when> <xsl:when test="$kw = 'attvals'"> <xsl:apply-templates select="@*" mode="attvallength"/> </xsl:when> <xsl:otherwise>0</xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template name="sum-list"> <xsl:param name="n0" select="0"/> <xsl:param name="s0"/> <xsl:variable name="s1" select="normalize-space($s0)"/> <!--* <xsl:message><xsl:value-of select="concat('n0 =', $n0, ', s1 = /',$s1,'/')"/></xsl:message> *--> <xsl:choose> <xsl:when test="contains($s1,' ')"> <xsl:variable name="term" select="substring-before($s1,' ')"/> <xsl:variable name="s2" select="substring-after($s1,' ')"/> <xsl:call-template name="sum-list"> <xsl:with-param name="n0" select="$n0 + $term"/> <xsl:with-param name="s0" select="$s2"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$n0 + $s1"/> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="@*" mode="attnamelength"> <xsl:value-of select="concat(string-length(name()), ' ')"/> </xsl:template> <xsl:template match="@*" mode="attvallength"> <xsl:value-of select="concat(string-length(.), ' ')"/> </xsl:template>
</xsl:stylesheet> <!– Keep this comment at the end of the file Local variables: mode: xml sgml-default-dtd-file:“/Library/SGML/Public/Emacs/xslt.ced” sgml-omittag:t sgml-shorttag:t sgml-indent-data:t sgml-indent-step:1 End: –>