74 lines
2.6 KiB
HTML
Executable file
74 lines
2.6 KiB
HTML
Executable file
<?xml version="1.0" encoding="utf-8" ?>
|
|
<xsl:stylesheet version="1.0"
|
|
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
xmlns="http://cygnets.co.uk/schemas/adl-1.2"
|
|
xmlns:a="http://cygnets.co.uk/schemas/adl-1.2"
|
|
exclude-result-prefixes="a">
|
|
<!--
|
|
Application Description Framework
|
|
types.xslt
|
|
|
|
(c) 2008 Cygnet Solutions Ltd
|
|
|
|
Deals with looking up type information.
|
|
|
|
$Author: af $
|
|
$Revision: 1.1 $
|
|
-->
|
|
<xsl:output indent="yes" method="xml" encoding="utf-8"/>
|
|
|
|
<!-- Convenience (if you can use that word with XSLT) to obtain a type name. -->
|
|
<xsl:template name="type-name">
|
|
<xsl:call-template name="type-attr">
|
|
<xsl:with-param name="attr" select="'name'" />
|
|
</xsl:call-template>
|
|
</xsl:template>
|
|
|
|
<!-- Retrieve a particular attribute from a type, possibly recursively through typedefs. -->
|
|
<xsl:template name="type-attr">
|
|
<xsl:param name="attr"/>
|
|
<!-- The attribute we want-->
|
|
|
|
<xsl:choose>
|
|
<xsl:when test="name()='type'">
|
|
<xsl:value-of select="@*[name()=$attr]"/>
|
|
</xsl:when>
|
|
|
|
<!-- Can we can resolve this immediately? -->
|
|
<xsl:when test="$attr!='name' and @*[name()=$attr]">
|
|
<xsl:value-of select="@*[name()=$attr]"/>
|
|
</xsl:when>
|
|
|
|
<!-- Otherwise look it up in the referred type -->
|
|
<xsl:otherwise>
|
|
<xsl:variable name="typename" select="@type" />
|
|
<xsl:choose>
|
|
<!-- Look up in the source document -->
|
|
<xsl:when test="/a:application/a:type[@name=$typename]|/a:application/a:typedef[@name=$typename]">
|
|
<xsl:for-each select="/a:application/a:type[@name=$typename]|/a:application/a:typedef[@name=$typename]">
|
|
<xsl:call-template name="type-attr">
|
|
<xsl:with-param name="attr" select="$attr"/>
|
|
</xsl:call-template>
|
|
</xsl:for-each>
|
|
</xsl:when>
|
|
<!-- Look up in global types.xml -->
|
|
<xsl:when test="document('types.xml')/types/*[@name=$typename]">
|
|
<xsl:for-each select="document('types.xml')/types/*[@name=$typename]">
|
|
<xsl:call-template name="type-attr">
|
|
<xsl:with-param name="attr" select="$attr"/>
|
|
</xsl:call-template>
|
|
</xsl:for-each>
|
|
</xsl:when>
|
|
<!-- Cannot find the type -->
|
|
<xsl:otherwise>
|
|
<xsl:message terminate="yes">
|
|
Cannot find type "<xsl:value-of select="$typename"/>".
|
|
</xsl:message>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:otherwise>
|
|
</xsl:choose>
|
|
</xsl:template>
|
|
|
|
|
|
</xsl:stylesheet> |