<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="available.xsl" type="text/xsl"?>
<html xmlns:dr="http://documenta.rudolphina.org/"
	xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title>XSLT Availability</title>
		<style type="text/css">
		body {
			padding: 20px 20px 30px 20px;
		}
		h1, p, ol {
			margin-left: 32px;
		}
		div.notes p {
			margin-top: 0;
			margin-bottom: 0;
		}
		ol {
			padding-left: 24px;
		}
		</style>
	</head>
	<body>
		<h1>XSLT 1.0 / XPath 1.0 Availability</h1>
		<p>Manfred Staudinger, Vienna (May 2008)</p>
		<p>
			Shows the status of an XSLT 1.0 / XPath 1.0 implementation for elements and
			functions, including any extensions, in 9 categories.
			The numbers given for each catagory (n in total) are the numbers of items
			tested. For xslt and xpath these are in accordance with the
			<a href="http://www.w3.org/TR/xslt">XSLT 1.0</a> and the
			<a href="http://www.w3.org/TR/xpath">XPath 1.0</a> specifications.
		</p>
		<dr:available>
			<dr:xslt>
				<dr:instructions>
					<dr:e>xsl:apply-imports</dr:e>
					<dr:e>xsl:apply-templates</dr:e>
					<dr:e>xsl:attribute</dr:e>
					<dr:e>xsl:call-template</dr:e>
					<dr:e>xsl:choose</dr:e>
					<dr:e>xsl:comment</dr:e>
					<dr:e>xsl:copy</dr:e>
					<dr:e>xsl:copy-of</dr:e>
					<dr:e>xsl:element</dr:e>
					<dr:e>xsl:fallback</dr:e>
					<dr:e>xsl:for-each</dr:e>
					<dr:e>xsl:if</dr:e>
					<dr:e>xsl:message</dr:e>
					<dr:e>xsl:number</dr:e>
					<dr:e>xsl:processing-instruction</dr:e>
					<dr:e>xsl:text</dr:e>
					<dr:e>xsl:value-of</dr:e>
					<dr:e>xsl:variable</dr:e>
				</dr:instructions>
				<dr:top-level-elements note="1">
					<dr:e>xsl:attribute-set</dr:e>
					<dr:e>xsl:decimal-format</dr:e>
					<dr:e>xsl:import</dr:e>
					<dr:e>xsl:include</dr:e>
					<dr:e>xsl:key</dr:e>
					<dr:e>xsl:namespace-alias</dr:e>
					<dr:e>xsl:output</dr:e>
					<dr:e>xsl:param</dr:e>
					<dr:e>xsl:preserve-space</dr:e>
					<dr:e>xsl:strip-space</dr:e>
					<dr:e>xsl:stylesheet</dr:e>
					<dr:e>xsl:template</dr:e>
					<dr:e>xsl:transform</dr:e>
				</dr:top-level-elements>
				<dr:special-context-elements note="1">
					<dr:e>xsl:with-param</dr:e>
					<dr:e>xsl:sort</dr:e>
					<dr:e>xsl:when</dr:e>
					<dr:e>xsl:otherwise</dr:e>
				</dr:special-context-elements>
				<dr:functions note="2">
					<dr:f>current</dr:f>
					<dr:f>document</dr:f>
					<dr:f>element-available</dr:f>
					<dr:f>format-number</dr:f>
					<dr:f>function-available</dr:f>
					<dr:f>generate-id</dr:f>
					<dr:f>key</dr:f>
					<dr:f>system-property</dr:f>
					<dr:f>unparsed-entity-uri</dr:f>
				</dr:functions>
			</dr:xslt>
			<dr:xpath>
				<dr:functions note="2">
					<dr:f>last</dr:f>
					<dr:f>position</dr:f>
					<dr:f>count</dr:f>
					<dr:f>id</dr:f>
					<dr:f>local-name</dr:f>
					<dr:f>namespace-uri</dr:f>
					<dr:f>name</dr:f>
					<dr:f>string</dr:f>
					<dr:f>concat</dr:f>
					<dr:f>starts-with</dr:f>
					<dr:f>contains</dr:f>
					<dr:f>substring-before</dr:f>
					<dr:f>substring-after</dr:f>
					<dr:f>substring</dr:f>
					<dr:f>string-length</dr:f>
					<dr:f>normalize-space</dr:f>
					<dr:f>translate</dr:f>
					<dr:f>boolean</dr:f>
					<dr:f>not</dr:f>
					<dr:f>true</dr:f>
					<dr:f>false</dr:f>
					<dr:f>lang</dr:f>
					<dr:f>number</dr:f>
					<dr:f>sum</dr:f>
					<dr:f>floor</dr:f>
					<dr:f>ceiling</dr:f>
					<dr:f>round</dr:f>
				</dr:functions>
			</dr:xpath>
			<dr:extension>
				<dr:instructions>
					<dr:e>saxon:assign</dr:e>
					<dr:e>saxon:doctype</dr:e>
					<dr:e>saxon:entity-ref</dr:e>
					<dr:e>saxon:group</dr:e>
					<dr:e>saxon:output</dr:e>
					<dr:e>saxon:while</dr:e>
				</dr:instructions>
				<dr:top-level-elements note="3">
					<dr:e>msxsl:script</dr:e>
					<dr:e>exsl:document</dr:e>
					<dr:e>date:date-format</dr:e>
					<dr:e>func:function</dr:e>
					<dr:e>func:result</dr:e>
					<dr:e>func:script</dr:e>
					<dr:e>saxon:function</dr:e>
					<dr:e>saxon:handler</dr:e>
					<dr:e>saxon:preview</dr:e>
					<dr:e>saxon:script</dr:e>
					<dr:e>xalan:component</dr:e>
					<dr:e>xalan:redirect</dr:e>
					<dr:e>libxslt:test</dr:e>
				</dr:top-level-elements>
				<dr:special-context-elements note="3">
					<dr:e>saxon:return</dr:e>
					<dr:e>saxon:item</dr:e>
					<dr:e>xalan:script</dr:e>
					<dr:e>xalan:write</dr:e>
					<dr:e>xalan:open</dr:e>
					<dr:e>xalan:close</dr:e>
				</dr:special-context-elements>
				<dr:functions>
					<dr:f>msxsl:node-set</dr:f>
					<dr:f>exsl:node-set</dr:f>
					<dr:f>exsl:object-type</dr:f>
					<dr:f>math:min</dr:f>
					<dr:f>math:max</dr:f>
					<dr:f>math:highest</dr:f>
					<dr:f>math:lowest</dr:f>
					<dr:f>math:abs</dr:f>
					<dr:f>math:acos</dr:f>
					<dr:f>math:asin</dr:f>
					<dr:f>math:atan</dr:f>
					<dr:f>math:atan2</dr:f>
					<dr:f>math:constant</dr:f>
					<dr:f>math:cos</dr:f>
					<dr:f>math:exp</dr:f>
					<dr:f>math:log</dr:f>
					<dr:f>math:power</dr:f>
					<dr:f>math:random</dr:f>
					<dr:f>math:sin</dr:f>
					<dr:f>math:sqrt</dr:f>
					<dr:f>math:tan</dr:f>
					<dr:f>set:difference</dr:f>
					<dr:f>set:intersection</dr:f>
					<dr:f>set:distinct</dr:f>
					<dr:f>set:has-same-node</dr:f>
					<dr:f>set:leading</dr:f>
					<dr:f>set:trailing</dr:f>
					<dr:f>date:date-time</dr:f>
					<dr:f>date:date</dr:f>
					<dr:f>date:time</dr:f>
					<dr:f>date:year</dr:f>
					<dr:f>date:leap-year</dr:f>
					<dr:f>date:month-in-year</dr:f>
					<dr:f>date:month-name</dr:f>
					<dr:f>date:month-abbreviation</dr:f>
					<dr:f>date:week-in-year</dr:f>
					<dr:f>date:week-in-month</dr:f>
					<dr:f>date:day-in-year</dr:f>
					<dr:f>date:day-in-month</dr:f>
					<dr:f>date:day-of-week-in-month</dr:f>
					<dr:f>date:day-in-week</dr:f>
					<dr:f>date:day-name</dr:f>
					<dr:f>date:day-abbreviation</dr:f>
					<dr:f>date:hour-in-day</dr:f>
					<dr:f>date:minute-in-hour</dr:f>
					<dr:f>date:second-in-minute</dr:f>
					<dr:f>date:format-date</dr:f>
					<dr:f>date:parse-date</dr:f>
					<dr:f>date:difference</dr:f>
					<dr:f>date:add</dr:f>
					<dr:f>date:add-duration</dr:f>
					<dr:f>date:sum</dr:f>
					<dr:f>date:seconds</dr:f>
					<dr:f>date:duration</dr:f>
					<dr:f>str:tokenize</dr:f>
					<dr:f>str:replace</dr:f>
					<dr:f>str:padding</dr:f>
					<dr:f>str:align</dr:f>
					<dr:f>str:encode-uri</dr:f>
					<dr:f>str:decode-uri</dr:f>
					<dr:f>str:concat</dr:f>
					<dr:f>str:split</dr:f>
					<dr:f>crypto:sha1</dr:f>
					<dr:f>crypto:md5</dr:f>
					<dr:f>crypto:rc4_encrypt</dr:f>
					<dr:f>crypto:rc4_decrypt</dr:f>
					<dr:f>crypto:md4</dr:f>
					<dr:f>regexp:test</dr:f>
					<dr:f>regexp:match</dr:f>
					<dr:f>regexp:replace</dr:f>
					<dr:f>dyn:map</dr:f>
					<dr:f>dyn:evaluate</dr:f>
					<dr:f>dyn:min</dr:f>
					<dr:f>dyn:max</dr:f>
					<dr:f>dyn:sum</dr:f>
					<dr:f>dyn:closure</dr:f>
					<dr:f>random:random-sequence</dr:f>
					<dr:f>saxon:after</dr:f>
					<dr:f>saxon:base-uri</dr:f>
					<dr:f>saxon:before</dr:f>
					<dr:f>saxon:closure</dr:f>
					<dr:f>saxon:difference</dr:f>
					<dr:f>saxon:distinct</dr:f>
					<dr:f>saxon:eval</dr:f>
					<dr:f>saxon:evaluate</dr:f>
					<dr:f>saxon:exists</dr:f>
					<dr:f>saxon:expression</dr:f>
					<dr:f>saxon:forAll</dr:f>
					<dr:f>saxon:for-all</dr:f>
					<dr:f>saxon:getPseudoAttribute</dr:f>
					<dr:f>saxon:get-pseudo-attribute</dr:f>
					<dr:f>saxon:getUserData</dr:f>
					<dr:f>saxon:get-user-data</dr:f>
					<dr:f>saxon:hasSameNodes</dr:f>
					<dr:f>saxon:has-same-nodes</dr:f>
					<dr:f>saxon:highest</dr:f>
					<dr:f>saxon:if</dr:f>
					<dr:f>saxon:ifNull</dr:f>
					<dr:f>saxon:if-null</dr:f>
					<dr:f>saxon:intersection</dr:f>
					<dr:f>saxon:is-null</dr:f>
					<dr:f>saxon:leading</dr:f>
					<dr:f>saxon:lineNumber</dr:f>
					<dr:f>saxon:line-number</dr:f>
					<dr:f>saxon:lowest</dr:f>
					<dr:f>saxon:max</dr:f>
					<dr:f>saxon:min</dr:f>
					<dr:f>saxon:nodeSet</dr:f>
					<dr:f>saxon:node-set</dr:f>
					<dr:f>saxon:path</dr:f>
					<dr:f>saxon:range</dr:f>
					<dr:f>saxon:setUserData</dr:f>
					<dr:f>saxon:set-user-data</dr:f>
					<dr:f>saxon:sum</dr:f>
					<dr:f>saxon:systemId</dr:f>
					<dr:f>saxon:system-id</dr:f>
					<dr:f>saxon:tokenize</dr:f>
					<dr:f>xalan:difference</dr:f>
					<dr:f>xalan:evaluate</dr:f>
					<dr:f>xalan:hasSameNodes</dr:f>
					<dr:f>xalan:intersection</dr:f>
					<dr:f>xalan:nodeset</dr:f>
					<dr:f>xalan:tokenize</dr:f>
					<dr:f>sql:new</dr:f>
					<dr:f>sql:query</dr:f>
					<dr:f>sql:close</dr:f>
					<dr:f>libxslt:test</dr:f>
				</dr:functions>
			</dr:extension>
		</dr:available>
		<div class="notes">
		<p>
			Notes:
		</p>
		<p>
			[1] element-available() is defined for instructions only and should return false()
			for any other element (
			<a href="http://www.w3.org/TR/xslt#function-element-available">
			XSLT 1.0 specification</a>
			and
			<a href="http://www.w3.org/1999/11/REC-xslt-19991116-errata/">
			errata</a>
			E7). Nevertheless some processors use true() to indicate the element has been
			implemented.
		</p>
		<p>
			[2] Due to a <a href="http://saxon.sourceforge.net/saxon6.5.5/limitations.html">bug</a>
			in Saxon 6.5.5, function-available() returns false() where it should return true().
		</p>
		<p>
			[3] In addition to [1], there seems to be no easy way to determine the list of
			extension elements (other than instructions) implemented. This might be the
			reason that many XSLT 1.0 implementations (MSXML3, Transformiix, Opera)
			have choosen to violate the specs here.
		</p>
		</div>
		<script src="http://www.google-analytics.com/urchin.js" type="text/javascript"/>
		<script type="text/javascript">_uacct="UA-534617-5";_uflash=0;urchinTracker();</script>
	</body>
</html>