use 3 space indentation instead of 2

This commit is contained in:
Mylloon 2024-05-03 01:59:58 +02:00
parent 5d3a184468
commit ead6b851ed
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
5 changed files with 310 additions and 304 deletions

146
data.xsd
View file

@ -1,90 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Valeur contenu par une substitution --> <!-- Valeur contenu par une substitution -->
<xs:simpleType name="Element"> <xs:simpleType name="Element">
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:pattern value="[A-Z]+" /> <xs:pattern value="[A-Z]+" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<!-- Valeur contenu par une substitution --> <!-- Valeur contenu par une substitution -->
<xs:simpleType name="SubElement"> <xs:simpleType name="SubElement">
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:pattern value="[A-Z|\[|\]]+" /> <xs:pattern value="[A-Z|\[|\]]+" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:complexType name="Substitution"> <xs:complexType name="Substitution">
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="SubElement"> <xs:extension base="SubElement">
<xs:attribute name="member" use="required"> <xs:attribute name="member" use="required">
<!-- Membre d'une substitution --> <!-- Membre d'une substitution -->
<xs:simpleType> <xs:simpleType>
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:pattern value="[A-Z]{1}" /> <xs:pattern value="[A-Z]{1}" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
</xs:attribute> </xs:attribute>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<!-- Valeur contenu par une interprétation --> <!-- Valeur contenu par une interprétation -->
<xs:simpleType name="InterpElement"> <xs:simpleType name="InterpElement">
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:pattern value="(LINE) \d+|(MOVE) \d+|(TURN) -?\d+|(RE)?(STORE)" /> <xs:pattern value="(LINE) \d+|(MOVE) \d+|(TURN) -?\d+|(RE)?(STORE)" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:complexType name="Interpretation"> <xs:complexType name="Interpretation">
<xs:simpleContent> <xs:simpleContent>
<xs:extension base="InterpElement"> <xs:extension base="InterpElement">
<xs:attribute name="member" use="required"> <xs:attribute name="member" use="required">
<!-- Membre d'une interprétation --> <!-- Membre d'une interprétation -->
<xs:simpleType> <xs:simpleType>
<xs:restriction base="xs:string"> <xs:restriction base="xs:string">
<xs:pattern value="[A-Z|\[|\]]{1}" /> <xs:pattern value="[A-Z|\[|\]]{1}" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
</xs:attribute> </xs:attribute>
</xs:extension> </xs:extension>
</xs:simpleContent> </xs:simpleContent>
</xs:complexType> </xs:complexType>
<xs:complexType name="Substitutions"> <xs:complexType name="Substitutions">
<xs:sequence> <xs:sequence>
<xs:element name="substitution" type="Substitution" maxOccurs="unbounded" /> <xs:element name="substitution" type="Substitution" maxOccurs="unbounded" />
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
<xs:complexType name="Interpretations"> <xs:complexType name="Interpretations">
<xs:sequence> <xs:sequence>
<xs:element name="interpretation" type="Interpretation" maxOccurs="unbounded" /> <xs:element name="interpretation" type="Interpretation" maxOccurs="unbounded" />
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
<xs:complexType name="Lsystem"> <xs:complexType name="Lsystem">
<xs:sequence> <xs:sequence>
<xs:element name="name" type="xs:string" /> <xs:element name="name" type="xs:string" />
<!-- TODO: On peut utiliser [a-z|\d] mais c'est peut-être <!-- TODO: On peut utiliser [a-z|\d] mais c'est peut-être
trop restrictif ? --> trop restrictif ? -->
<xs:element name="base" type="Element" /> <xs:element name="base" type="Element" />
<xs:element name="axiom" type="Element" /> <xs:element name="axiom" type="Element" />
<xs:element name="substitutions" type="Substitutions" /> <xs:element name="substitutions" type="Substitutions" />
<xs:element name="interpretations" type="Interpretations" /> <xs:element name="interpretations" type="Interpretations" />
</xs:sequence>
</xs:complexType>
<xs:element name="lsystems">
<xs:complexType>
<xs:sequence>
<xs:element name="lsystem" type="Lsystem" maxOccurs="unbounded" />
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
</xs:element>
<xs:element name="lsystems">
<xs:complexType>
<xs:sequence>
<xs:element name="lsystem" type="Lsystem" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema> </xs:schema>

View file

@ -1,23 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Empty"> <xs:complexType name="Empty">
</xs:complexType> </xs:complexType>
<xs:element name="tortue"> <xs:element name="tortue">
<xs:complexType> <xs:complexType>
<xs:choice maxOccurs="unbounded"> <xs:choice maxOccurs="unbounded">
<xs:element name="line" type="xs:positiveInteger" /> <xs:element name="line" type="xs:positiveInteger" />
<xs:element name="move" type="xs:positiveInteger" /> <xs:element name="move" type="xs:positiveInteger" />
<xs:element name="turn" type="xs:integer" /> <xs:element name="turn" type="xs:integer" />
<!-- TODO: Store que si on a déja eu un line/move --> <!-- TODO: Store que si on a déja eu un line/move -->
<xs:element name="store" type="Empty" /> <xs:element name="store" type="Empty" />
<!-- TODO: Restore que si on a déjà eu un store --> <!-- TODO: Restore que si on a déjà eu un store -->
<xs:element name="restore" type="Empty" /> <xs:element name="restore" type="Empty" />
</xs:choice> </xs:choice>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
</xs:schema> </xs:schema>

View file

@ -1,124 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" /> <xsl:output indent="yes" />
<xsl:param name="nom" /> <xsl:param name="nom" />
<xsl:param name="n" /> <xsl:param name="n" />
<!-- Pour le Lsystem --> <!-- Pour le Lsystem -->
<xsl:template match="lsystem"> <xsl:template match="lsystem">
<tortue> <tortue>
<xsl:call-template name="substitution"> <xsl:call-template name="substitution">
<xsl:with-param name="actuel" select="axiom" /> <xsl:with-param name="actuel" select="axiom" />
<xsl:with-param name="n" select="$n" /> <xsl:with-param name="n" select="$n" />
</xsl:call-template> </xsl:call-template>
</tortue> </tortue>
</xsl:template> </xsl:template>
<!-- Substitution --> <!-- Substitution -->
<xsl:template name="substitution"> <xsl:template name="substitution">
<xsl:param name="actuel" /> <xsl:param name="actuel" />
<xsl:param name="n" /> <xsl:param name="n" />
<!-- Si on doit encore substituer --> <!-- Si on doit encore substituer -->
<xsl:choose> <xsl:choose>
<xsl:when test="$n > 0"> <xsl:when test="$n > 0">
<!-- Applique la substitution --> <!-- Applique la substitution -->
<xsl:variable name="data"> <xsl:variable name="data">
<xsl:call-template name="Application"> <xsl:call-template name="Application">
<xsl:with-param name="data" select="$actuel" /> <xsl:with-param name="data" select="$actuel" />
</xsl:call-template> </xsl:call-template>
</xsl:variable> </xsl:variable>
<!-- Appel récursif --> <!-- Appel récursif -->
<xsl:call-template <xsl:call-template
name="substitution"> name="substitution">
<xsl:with-param name="actuel" select="$data" /> <xsl:with-param name="actuel" select="$data" />
<xsl:with-param name="n" select="$n - 1" /> <xsl:with-param name="n" select="$n - 1" />
</xsl:call-template> </xsl:call-template>
</xsl:when> </xsl:when>
<xsl:otherwise> <xsl:otherwise>
<!-- Interprétation --> <!-- Interprétation -->
<xsl:call-template name="Interpretation"> <xsl:call-template name="Interpretation">
<xsl:with-param name="data" select="$actuel" /> <xsl:with-param name="data" select="$actuel" />
</xsl:call-template> </xsl:call-template>
</xsl:otherwise> </xsl:otherwise>
</xsl:choose> </xsl:choose>
</xsl:template> </xsl:template>
<!-- Applique la substitution --> <!-- Applique la substitution -->
<xsl:template name="Application"> <xsl:template name="Application">
<xsl:param name="data" /> <xsl:param name="data" />
<xsl:variable name="substitution" select="substitutions/substitution" /> <xsl:variable name="substitution" select="substitutions/substitution" />
<xsl:analyze-string <xsl:analyze-string
select="$data" regex="."> select="$data" regex=".">
<xsl:matching-substring> <xsl:matching-substring>
<xsl:value-of select="$substitution[@member = current()]" /> <xsl:value-of select="$substitution[@member = current()]" />
</xsl:matching-substring> </xsl:matching-substring>
</xsl:analyze-string> </xsl:analyze-string>
</xsl:template> </xsl:template>
<!-- Interprète la séquence --> <!-- Interprète la séquence -->
<xsl:template name="Interpretation"> <xsl:template name="Interpretation">
<xsl:param name="data" /> <xsl:param name="data" />
<xsl:variable name="interpretation" <xsl:variable name="interpretation"
select="interpretations/interpretation" /> select="interpretations/interpretation" />
<xsl:analyze-string <xsl:analyze-string
select="$data" regex="."> select="$data" regex=".">
<xsl:matching-substring> <xsl:matching-substring>
<xsl:variable name="action" <xsl:variable name="action"
select="$interpretation[@member = current()]" /> select="$interpretation[@member = current()]" />
<xsl:choose> <xsl:choose>
<!-- Ecrire --> <!-- Ecrire -->
<!-- TODO: Si plusieurs <line /> se suivent on pourrait les additionner --> <!-- TODO: Si plusieurs <line /> se suivent on pourrait les additionner -->
<xsl:when test="matches($action, '^LINE \d+$')"> <xsl:when test="matches($action, '^LINE \d+$')">
<line> <line>
<xsl:value-of select="substring-after($action, 'LINE ')" /> <xsl:value-of select="substring-after($action, 'LINE ')" />
</line> </line>
</xsl:when> </xsl:when>
<!-- Déplacer --> <!-- Déplacer -->
<!-- TODO: Si plusieurs <move /> se suivent on pourrait les additionner --> <!-- TODO: Si plusieurs <move /> se suivent on pourrait les additionner -->
<xsl:when test="matches($action, '^MOVE \d+$')"> <xsl:when test="matches($action, '^MOVE \d+$')">
<move> <move>
<xsl:value-of select="substring-after($action, 'MOVE ')" /> <xsl:value-of select="substring-after($action, 'MOVE ')" />
</move> </move>
</xsl:when> </xsl:when>
<!-- Tourner --> <!-- Tourner -->
<!-- TODO: Si plusieurs <turn /> se suivent on pourrait les additionner --> <!-- TODO: Si plusieurs <turn /> se suivent on pourrait les additionner -->
<xsl:when test="matches($action, '^TURN -?\d+$')"> <xsl:when test="matches($action, '^TURN -?\d+$')">
<turn> <turn>
<xsl:value-of select="substring-after($action, 'TURN ')" /> <xsl:value-of select="substring-after($action, 'TURN ')" />
</turn> </turn>
</xsl:when> </xsl:when>
<!-- Store --> <!-- Store -->
<xsl:when test="$action = 'STORE'"> <xsl:when test="$action = 'STORE'">
<store /> <store />
</xsl:when> </xsl:when>
<!-- Restore --> <!-- Restore -->
<xsl:when test="$action = 'RESTORE'"> <xsl:when test="$action = 'RESTORE'">
<restore /> <restore />
</xsl:when> </xsl:when>
<!-- Debug --> <!-- Debug -->
<!-- <xsl:otherwise> <!-- <xsl:otherwise>
<action> <action>
<xsl:value-of select="$interpretation[@member = current()]" /> <xsl:value-of select="$interpretation[@member = current()]" />
</action> </action>
</xsl:otherwise> --> </xsl:otherwise> -->
</xsl:choose> </xsl:choose>
</xsl:matching-substring> </xsl:matching-substring>
</xsl:analyze-string> </xsl:analyze-string>
</xsl:template> </xsl:template>
<!-- On récupère le Lsystem qui nous intéresse --> <!-- On récupère le Lsystem qui nous intéresse -->
<xsl:template match="/"> <xsl:template match="/">
<xsl:processing-instruction name="xml-model">href="tortue.xsd"</xsl:processing-instruction> <xsl:processing-instruction name="xml-model">href="tortue.xsd"</xsl:processing-instruction>
<xsl:apply-templates <xsl:apply-templates
select="lsystems/lsystem[name=$nom]" /> select="lsystems/lsystem[name=$nom]" />
</xsl:template> </xsl:template>
</xsl:transform> </xsl:transform>

View file

@ -1,24 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="traceur"> <xs:element name="traceur">
<xs:complexType> <xs:complexType>
<xs:sequence> <xs:sequence>
<!-- Peut contenir plusieurs "LINETO" ou "MOVETO" --> <!-- Peut contenir plusieurs "LINETO" ou "MOVETO" -->
<xs:choice maxOccurs="unbounded"> <xs:choice maxOccurs="unbounded">
<xs:element name="LINETO"> <xs:element name="LINETO">
<xs:complexType> <xs:complexType>
<xs:attribute name="x" type="xs:decimal" use="required" /> <xs:attribute name="x" type="xs:decimal" use="required" />
<xs:attribute name="y" type="xs:decimal" use="required" /> <xs:attribute name="y" type="xs:decimal" use="required" />
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
<xs:element name="MOVETO"> <xs:element name="MOVETO">
<xs:complexType> <xs:complexType>
<xs:attribute name="x" type="xs:decimal" use="required" /> <xs:attribute name="x" type="xs:decimal" use="required" />
<xs:attribute name="y" type="xs:decimal" use="required" /> <xs:attribute name="y" type="xs:decimal" use="required" />
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
</xs:choice> </xs:choice>
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
</xs:schema> </xs:schema>

View file

@ -1,165 +1,171 @@
<xsl:transform version="3.0" <xsl:transform version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs math"> exclude-result-prefixes="xs math">
<xsl:output method="xml" indent="yes" /> <xsl:output method="xml" indent="yes" />
<!-- Déclaration des variables initiales --> <!-- Déclaration des variables initiales -->
<xsl:variable name="initial-x" select="0" as="xs:double" /> <xsl:variable name="initial-x" select="0" as="xs:double" />
<xsl:variable <xsl:variable
name="initial-y" select="0" as="xs:double" /> name="initial-y" select="0" as="xs:double" />
<xsl:variable name="initial-angle" select="0" <xsl:variable name="initial-angle" select="0"
as="xs:double" /> as="xs:double" />
<xsl:template match="/tortue"> <xsl:template match="/tortue">
<xsl:processing-instruction name="xml-model">href="traceur.xsd"</xsl:processing-instruction> <xsl:processing-instruction name="xml-model">href="traceur.xsd"</xsl:processing-instruction>
<traceur> <traceur>
<!-- Appel du template pour traiter les commandes avec les valeurs initiales des <!-- Appel du template pour traiter les commandes avec les valeurs initiales des
paramètres --> paramètres -->
<xsl:call-template name="process-commands"> <xsl:call-template name="process-commands">
<xsl:with-param name="commands" select="*" /> <xsl:with-param name="commands" select="*" />
<xsl:with-param name="x" select="$initial-x" /> <xsl:with-param name="x"
select="$initial-x" />
<xsl:with-param <xsl:with-param
name="y" select="$initial-y" /> name="y" select="$initial-y" />
<xsl:with-param <xsl:with-param
name="angle" select="$initial-angle" /> name="angle" select="$initial-angle" />
<xsl:with-param name="states" select="()" /> <xsl:with-param name="states" select="()" />
</xsl:call-template> </xsl:call-template>
</traceur> </traceur>
</xsl:template> </xsl:template>
<!-- Template récursif pour traiter les commandes individuelles --> <!-- Template récursif pour traiter les commandes individuelles -->
<xsl:template <xsl:template
name="process-commands"> name="process-commands">
<xsl:param name="commands" /> <xsl:param name="commands" />
<xsl:param name="x" /> <xsl:param name="x" />
<xsl:param name="y" /> <xsl:param name="y" />
<xsl:param name="angle" />
<xsl:param <xsl:param
name="states" /> name="angle" />
<xsl:param
name="states" />
<!-- Si il reste des commandes à traiter --> <!-- Si il reste des commandes à traiter -->
<xsl:if test="$commands"> <xsl:if test="$commands">
<!-- Sélection de la première commande à traiter --> <!-- Sélection de la première commande à traiter -->
<xsl:variable <xsl:variable
name="current-command" select="$commands[1]" /> name="current-command" select="$commands[1]" />
<xsl:choose> <xsl:choose>
<!-- Si la commande est une ligne --> <!-- Si la commande est une ligne -->
<xsl:when test="local-name($current-command) = 'line'"> <xsl:when test="local-name($current-command) = 'line'">
<!-- Calcul de la distance à parcourir et conversion de l'angle en radians --> <!-- Calcul de la distance à parcourir et conversion de l'angle en radians -->
<xsl:variable name="distance" <xsl:variable name="distance"
select="number($current-command)" /> select="number($current-command)" />
<xsl:variable name="radians" <xsl:variable name="radians"
select="$angle * math:pi() div 180" /> select="$angle * math:pi() div 180" />
<xsl:variable name="new-x" <xsl:variable name="new-x"
select="$x + $distance * math:cos($radians)" /> select="$x + $distance * math:cos($radians)" />
<xsl:variable name="new-y" <xsl:variable name="new-y"
select="$y + $distance * math:sin($radians)" /> select="$y + $distance * math:sin($radians)" />
<!-- Création de l'élément LINETO avec les nouvelles coordonnées calculées --> <!-- Création de l'élément LINETO avec les nouvelles coordonnées calculées -->
<LINETO <LINETO
x="{format-number($new-x, '#.######')}" x="{format-number($new-x, '#.######')}"
y="{format-number($new-y, '#.######')}" /> y="{format-number($new-y, '#.######')}" />
<!-- Rappel récursif du template avec la mise à jour des coordonnées et des <!-- Rappel récursif du template avec la mise à jour des coordonnées et des
commandes restantes --> commandes restantes -->
<xsl:call-template name="process-commands"> <xsl:call-template
<xsl:with-param name="commands" select="$commands[position() > 1]" /> name="process-commands">
<xsl:with-param name="commands" select="$commands[position() > 1]" />
<xsl:with-param <xsl:with-param
name="x" select="$new-x" /> name="x" select="$new-x" />
<xsl:with-param name="y" select="$new-y" /> <xsl:with-param name="y" select="$new-y" />
<xsl:with-param <xsl:with-param
name="angle" select="$angle" /> name="angle" select="$angle" />
<xsl:with-param name="states" select="$states" /> <xsl:with-param name="states" select="$states" />
</xsl:call-template> </xsl:call-template>
</xsl:when> </xsl:when>
<!-- Si la commande est un turn --> <!-- Si la commande est un turn -->
<xsl:when test="local-name($current-command) = 'turn'"> <xsl:when test="local-name($current-command) = 'turn'">
<!-- Calcul du nouvel angle avec modulo 360 pour rester dans un cercle complet --> <!-- Calcul du nouvel angle avec modulo 360 pour rester dans un cercle complet -->
<xsl:variable <xsl:variable
name="new-angle" select="($angle + number($current-command)) mod 360" /> name="new-angle" select="($angle + number($current-command)) mod 360" />
<!-- Rappel récursif du template sans changer de position mais en mettant à jour <!-- Rappel récursif du template sans changer de position mais en mettant à jour
l'angle --> l'angle -->
<xsl:call-template <xsl:call-template
name="process-commands"> name="process-commands">
<xsl:with-param name="commands" select="$commands[position() > 1]" /> <xsl:with-param name="commands" select="$commands[position() > 1]" />
<xsl:with-param <xsl:with-param
name="x" select="$x" /> name="x" select="$x" />
<xsl:with-param name="y" select="$y" /> <xsl:with-param name="y" select="$y" />
<xsl:with-param <xsl:with-param
name="angle" select="$new-angle" /> name="angle" select="$new-angle" />
<xsl:with-param name="states" select="$states" /> <xsl:with-param name="states"
</xsl:call-template> select="$states" />
</xsl:when> </xsl:call-template>
<!-- Si la commande est un MOVE --> </xsl:when>
<xsl:when test="local-name($current-command) = 'move'"> <!-- Si la commande est un MOVE -->
<!-- Calcul de la distance à parcourir et conversion de l'angle en radians --> <xsl:when test="local-name($current-command) = 'move'">
<!-- Calcul de la distance à parcourir et conversion de l'angle en radians -->
<xsl:variable name="distance" <xsl:variable name="distance"
select="number($current-command)" /> select="number($current-command)" />
<xsl:variable name="radians" <xsl:variable name="radians"
select="$angle * math:pi() div 180" /> select="$angle * math:pi() div 180" />
<xsl:variable name="new-x" <xsl:variable name="new-x"
select="$x + $distance * math:cos($radians)" /> select="$x + $distance * math:cos($radians)" />
<xsl:variable name="new-y" <xsl:variable name="new-y"
select="$y + $distance * math:sin($radians)" /> select="$y + $distance * math:sin($radians)" />
<!-- Création de l'élément MOVETO avec les nouvelles coordonnées calculées --> <!-- Création de l'élément MOVETO avec les nouvelles coordonnées calculées -->
<MOVETO <MOVETO
x="{format-number($new-x, '#.######')}" x="{format-number($new-x, '#.######')}"
y="{format-number($new-y, '#.######')}" /> y="{format-number($new-y, '#.######')}" />
<!-- Rappel récursif du template avec la mise à jour des coordonnées et des <!-- Rappel récursif du template avec la mise à jour des coordonnées et des
commandes restantes --> commandes restantes -->
<xsl:call-template name="process-commands"> <xsl:call-template
<xsl:with-param name="commands" select="$commands[position() > 1]" /> name="process-commands">
<xsl:with-param name="commands" select="$commands[position() > 1]" />
<xsl:with-param <xsl:with-param
name="x" select="$new-x" /> name="x" select="$new-x" />
<xsl:with-param name="y" select="$new-y" /> <xsl:with-param name="y" select="$new-y" />
<xsl:with-param <xsl:with-param
name="angle" select="$angle" /> name="angle" select="$angle" />
<xsl:with-param name="states" select="$states" /> <xsl:with-param name="states" select="$states" />
</xsl:call-template> </xsl:call-template>
</xsl:when> </xsl:when>
<!-- Si la commande est un store --> <!-- Si la commande est un store -->
<xsl:when test="local-name($current-command) = 'store'"> <xsl:when test="local-name($current-command) = 'store'">
<!-- On enregistre le nouvelle état--> <!-- On enregistre le nouvelle état-->
<xsl:variable name="new-state"> <xsl:variable name="new-state">
<state x="{$x}" y="{$y}" angle="{$angle}" /> <state x="{$x}" y="{$y}" angle="{$angle}" />
</xsl:variable> </xsl:variable>
<!-- On l'ajoute au précédent --> <!-- On l'ajoute au précédent -->
<xsl:variable <xsl:variable
name="new-states" select="($states, $new-state)" /> name="new-states" select="($states, $new-state)" />
<xsl:call-template <xsl:call-template
name="process-commands"> name="process-commands">
<xsl:with-param name="commands" select="$commands[position() > 1]" /> <xsl:with-param name="commands" select="$commands[position() > 1]" />
<xsl:with-param <xsl:with-param
name="x" select="$x" /> name="x" select="$x" />
<xsl:with-param name="y" select="$y" /> <xsl:with-param name="y" select="$y" />
<xsl:with-param <xsl:with-param
name="angle" select="$angle" /> name="angle" select="$angle" />
<xsl:with-param name="states" select="$new-states" /> <xsl:with-param name="states"
</xsl:call-template> select="$new-states" />
</xsl:when> </xsl:call-template>
<!-- Si la commande est un restore et que au moins 1 état est enregistré : --> </xsl:when>
<xsl:when test="local-name($current-command) = 'restore' and count($states)>=1"> <!-- Si la commande est un restore et que au moins 1 état est enregistré : -->
<!-- On séléctionne notre state--> <xsl:when test="local-name($current-command) = 'restore' and count($states)>=1">
<!-- On séléctionne notre state-->
<xsl:variable <xsl:variable
name="state" select="$states/state[1]" /> name="state" select="$states/state[1]" />
<xsl:variable <xsl:variable
name="remaining-states" name="remaining-states"
select="subsequence($states/state, 1, count($states/state) - 1)" /> select="subsequence($states/state, 1, count($states/state) - 1)" />
<xsl:call-template <xsl:call-template
name="process-commands"> name="process-commands">
<xsl:with-param name="commands" select="$commands[position() > 1]" /> <xsl:with-param name="commands" select="$commands[position() > 1]" />
<xsl:with-param <xsl:with-param
name="x" select="($state/@x)[last()]" /> name="x" select="($state/@x)[last()]" />
<xsl:with-param name="y" <xsl:with-param name="y"
select="($state/@y)[last()]" /> select="($state/@y)[last()]" />
<xsl:with-param name="angle" <xsl:with-param name="angle"
select="($state/@angle)[last()]" /> select="($state/@angle)[last()]" />
<xsl:with-param name="states" <xsl:with-param name="states"
select="$remaining-states" /> select="$remaining-states" />
</xsl:call-template> </xsl:call-template>
</xsl:when> </xsl:when>
</xsl:choose> </xsl:choose>
</xsl:if> </xsl:if>
</xsl:template> </xsl:template>
</xsl:transform> </xsl:transform>