This library is free software; you can redistribute it and/or modify it under the terms of
the GNU Lesser General Public License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. This library is
distributed 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. See the GNU Lesser
General Public License for more details. You should have received a copy of the GNU Lesser
General Public License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
<xsl:template match="processing-instruction()"><xsl:choose><xsl:when test="name(.) = 'odds'"><xsl:choose><xsl:when test=".='date'">This formatted version of the Guidelines was created on<xsl:call-template name="showDate"/>.</xsl:when></xsl:choose></xsl:when><xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise></xsl:choose></xsl:template>
<xsl:template match="rng:group"><!-- check if this group is identical to the last --><xsl:choose><xsl:when test="count(rng:*)=1 and local-name(preceding-sibling::rng:*[1])='group' and rng:zeroOrMore"><xsl:variable name="that"><xsl:for-each select="preceding-sibling::rng:*[1]"><xsl:apply-templates mode="decomposed"/></xsl:for-each></xsl:variable><xsl:variable name="this"><xsl:apply-templates mode="decomposed"/></xsl:variable><xsl:choose><xsl:when test="$that=$this"/><xsl:otherwise><xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates select="rng:*|tei:*|text()|comment()"/></xsl:copy></xsl:otherwise></xsl:choose></xsl:when><xsl:otherwise><xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates select="rng:*|tei:*|text()|comment()"/></xsl:copy></xsl:otherwise></xsl:choose></xsl:template>
<xsl:template name="makeSimpleAttribute"><xsl:variable name="name"><xsl:choose><xsl:when test="tei:altIdent=@ident"><xsl:value-of select="@ident"/></xsl:when><xsl:when test="tei:altIdent"><xsl:value-of select="normalize-space(tei:altIdent)"/></xsl:when><xsl:otherwise><xsl:if test="@ns='http://www.w3.org/XML/1998/namespace'">xml:</xsl:if><xsl:value-of select="@ident"/></xsl:otherwise></xsl:choose></xsl:variable><attribute xmlns="http://relaxng.org/ns/structure/1.0" name="{$name}"><xsl:if test="@ns"><xsl:copy-of select="@ns"/></xsl:if><xsl:if test="tei:defaultVal and not(tei:defaultVal='')"><xsl:attribute name="a:defaultValue"><xsl:value-of select="normalize-space(tei:defaultVal)"/></xsl:attribute></xsl:if><xsl:if test="not($oddmode='tei')"><a:documentation><xsl:call-template name="makeDescription"><xsl:with-param name="includeValList">true</xsl:with-param><xsl:with-param name="coded">false</xsl:with-param></xsl:call-template></a:documentation></xsl:if><!-- ************************************ --><!-- Ascertain minOccurs= and maxOccurs=. --><!-- ************************************ --><!-- get the value of minOccurs=, defaulting to "1" --><xsl:variable name="minOccurs"><xsl:choose><xsl:when test="tei:datatype/@minOccurs"><xsl:value-of select="tei:datatype/@minOccurs"/></xsl:when><xsl:otherwise>1</xsl:otherwise></xsl:choose></xsl:variable><!-- get the value of maxOccurs=, defaulting to "1" --><xsl:variable name="maxOccurs"><xsl:choose><xsl:when test="tei:datatype/@maxOccurs"><xsl:value-of select="tei:datatype/@maxOccurs"/></xsl:when><xsl:otherwise>1</xsl:otherwise></xsl:choose></xsl:variable><!-- We now have two _string_ representations of the attrs, but --><!-- we need integers. So cast them, converting "unbounded" to --><!-- a special flag value (-1): --><xsl:variable name="min" select="xs:integer( $minOccurs )"/><xsl:variable name="max"><xsl:choose><xsl:when test="$maxOccurs='unbounded'"><xsl:value-of select="xs:integer( -1 )"/></xsl:when><xsl:otherwise><xsl:value-of select="xs:integer( $maxOccurs )"/></xsl:otherwise></xsl:choose></xsl:variable><xsl:choose><xsl:when test="tei:datatype/rng:text or not( tei:datatype ) or $max=1"><!-- If there is only going to be one output RELAX NG node --><!-- in the attribute definition, then we don't need to --><!-- bother with the complex min & max code below (in the --><!-- <xsl:otherwise>). Although it would generate the right --><!-- number of RELAX NG constructs, it wraps them in a --><!-- <list>, which makes no sense in some cases, and will --><!-- cause an error if the RELAX NG node inside the list is --><!-- <text>. --><!-- Cases we handle here: --><!-- * my <datatype> child has an <rng:text> child: only 1 --><!-- output node (<rng:text>), which can't be wrapped in --><!-- a <list> --><!-- * I don't have a <datatype> child: the 'attributeData' --><!-- template will spit out a single <rng:text> node (see --><!-- the outermost <xsl:otherwise> of that template) --><!-- * @maxOccurs=1: whatever ends up being generated, there --><!-- will only be 1 of them, so no need for a <list> --><xsl:call-template name="attributeData"/></xsl:when><xsl:otherwise><!-- Note that in the (erroneous) event --><!-- that minOccurs= is greater than --><!-- maxOccurs=, the latter is simply --><!-- ignored. --><!-- Hack(?): --><!-- The 'attributeData' template needs to operate from this node; --><!-- However, once we've used for-each to "loop", we've lost the --><!-- current node (it has become one of the integers in the select= --><!-- range). So here we remember the current node, and re-set it --><!-- before calling 'attributeData'. Perhaps it would be better to --><!-- send it as a parameter to 'attributeData' and have it set the --><!-- current node, but since I didn't write 'attributeData', I've --><!-- chosen this method so I don't have to muck with it. -Syd --><xsl:variable name="thisNode" select="."/><list><xsl:if test="$min > 0"><xsl:for-each select="1 to $min"><xsl:for-each select="$thisNode"><xsl:call-template name="attributeData"/></xsl:for-each></xsl:for-each></xsl:if><xsl:choose><xsl:when test="$max= -1"><!-- i.e., unbounded --><zeroOrMore><xsl:for-each select="$thisNode"><xsl:call-template name="attributeData"/></xsl:for-each></zeroOrMore></xsl:when><xsl:otherwise><xsl:for-each select="xs:integer( $min + 1 ) to $max"><optional><xsl:for-each select="$thisNode"><xsl:call-template name="attributeData"/></xsl:for-each></optional></xsl:for-each></xsl:otherwise></xsl:choose></list></xsl:otherwise></xsl:choose></attribute></xsl:template>