1*cda5da8dSAndroid Build Coastguard Worker<?xml version="1.0" encoding="UTF-8"?> 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Worker<!-- 4*cda5da8dSAndroid Build Coastguard Worker xml2dot.xsl - transform Bison XML Report into DOT. 5*cda5da8dSAndroid Build Coastguard Worker 6*cda5da8dSAndroid Build Coastguard Worker Copyright (C) 2007-2015, 2018-2021 Free Software Foundation, Inc. 7*cda5da8dSAndroid Build Coastguard Worker 8*cda5da8dSAndroid Build Coastguard Worker This file is part of Bison, the GNU Compiler Compiler. 9*cda5da8dSAndroid Build Coastguard Worker 10*cda5da8dSAndroid Build Coastguard Worker This program is free software: you can redistribute it and/or modify 11*cda5da8dSAndroid Build Coastguard Worker it under the terms of the GNU General Public License as published by 12*cda5da8dSAndroid Build Coastguard Worker the Free Software Foundation, either version 3 of the License, or 13*cda5da8dSAndroid Build Coastguard Worker (at your option) any later version. 14*cda5da8dSAndroid Build Coastguard Worker 15*cda5da8dSAndroid Build Coastguard Worker This program is distributed in the hope that it will be useful, 16*cda5da8dSAndroid Build Coastguard Worker but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cda5da8dSAndroid Build Coastguard Worker MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cda5da8dSAndroid Build Coastguard Worker GNU General Public License for more details. 19*cda5da8dSAndroid Build Coastguard Worker 20*cda5da8dSAndroid Build Coastguard Worker You should have received a copy of the GNU General Public License 21*cda5da8dSAndroid Build Coastguard Worker along with this program. If not, see <https://www.gnu.org/licenses/>. 22*cda5da8dSAndroid Build Coastguard Worker 23*cda5da8dSAndroid Build Coastguard Worker Written by Wojciech Polak <[email protected]>. 24*cda5da8dSAndroid Build Coastguard Worker --> 25*cda5da8dSAndroid Build Coastguard Worker 26*cda5da8dSAndroid Build Coastguard Worker<xsl:stylesheet version="1.0" 27*cda5da8dSAndroid Build Coastguard Worker xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 28*cda5da8dSAndroid Build Coastguard Worker xmlns:bison="https://www.gnu.org/software/bison/"> 29*cda5da8dSAndroid Build Coastguard Worker 30*cda5da8dSAndroid Build Coastguard Worker<xsl:import href="bison.xsl"/> 31*cda5da8dSAndroid Build Coastguard Worker<xsl:output method="text" encoding="UTF-8" indent="no"/> 32*cda5da8dSAndroid Build Coastguard Worker 33*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="/"> 34*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="bison-xml-report"/> 35*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 36*cda5da8dSAndroid Build Coastguard Worker 37*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="bison-xml-report"> 38*cda5da8dSAndroid Build Coastguard Worker <xsl:text>// Generated by GNU Bison </xsl:text> 39*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="@version"/> 40*cda5da8dSAndroid Build Coastguard Worker <xsl:text>. </xsl:text> 41*cda5da8dSAndroid Build Coastguard Worker <xsl:text>// Report bugs to <</xsl:text> 42*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="@bug-report"/> 43*cda5da8dSAndroid Build Coastguard Worker <xsl:text>>. </xsl:text> 44*cda5da8dSAndroid Build Coastguard Worker <xsl:text>// Home page: <</xsl:text> 45*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="@url"/> 46*cda5da8dSAndroid Build Coastguard Worker <xsl:text>>. </xsl:text> 47*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="automaton"> 48*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="filename" select="filename"/> 49*cda5da8dSAndroid Build Coastguard Worker </xsl:apply-templates> 50*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 51*cda5da8dSAndroid Build Coastguard Worker 52*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="automaton"> 53*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="filename"/> 54*cda5da8dSAndroid Build Coastguard Worker <xsl:text>digraph "</xsl:text> 55*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="escape"> 56*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="subject" select="$filename"/> 57*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 58*cda5da8dSAndroid Build Coastguard Worker <xsl:text>" { 59*cda5da8dSAndroid Build Coastguard Worker node [fontname = courier, shape = box, colorscheme = paired6] 60*cda5da8dSAndroid Build Coastguard Worker edge [fontname = courier] 61*cda5da8dSAndroid Build Coastguard Worker 62*cda5da8dSAndroid Build Coastguard Worker</xsl:text> 63*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="state"/> 64*cda5da8dSAndroid Build Coastguard Worker <xsl:text>} </xsl:text> 65*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 66*cda5da8dSAndroid Build Coastguard Worker 67*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="automaton/state"> 68*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="output-node"> 69*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="number" select="@number"/> 70*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="label"> 71*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="itemset/item"/> 72*cda5da8dSAndroid Build Coastguard Worker </xsl:with-param> 73*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 74*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="actions/transitions"/> 75*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="actions/reductions"> 76*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="staten"> 77*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="@number"/> 78*cda5da8dSAndroid Build Coastguard Worker </xsl:with-param> 79*cda5da8dSAndroid Build Coastguard Worker </xsl:apply-templates> 80*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 81*cda5da8dSAndroid Build Coastguard Worker 82*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="actions/reductions"> 83*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="staten"/> 84*cda5da8dSAndroid Build Coastguard Worker <xsl:for-each select='reduction'> 85*cda5da8dSAndroid Build Coastguard Worker <!-- These variables are needed because the current context can't be 86*cda5da8dSAndroid Build Coastguard Worker referred to directly in XPath expressions. --> 87*cda5da8dSAndroid Build Coastguard Worker <xsl:variable name="rul"> 88*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="@rule"/> 89*cda5da8dSAndroid Build Coastguard Worker </xsl:variable> 90*cda5da8dSAndroid Build Coastguard Worker <xsl:variable name="ena"> 91*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="@enabled"/> 92*cda5da8dSAndroid Build Coastguard Worker </xsl:variable> 93*cda5da8dSAndroid Build Coastguard Worker <!-- The foreach's body is protected by this, so that we are actually 94*cda5da8dSAndroid Build Coastguard Worker going to iterate once per reduction rule, and not per lookahead. --> 95*cda5da8dSAndroid Build Coastguard Worker <xsl:if test='not(preceding-sibling::*[@rule=$rul and @enabled=$ena])'> 96*cda5da8dSAndroid Build Coastguard Worker <xsl:variable name="rule"> 97*cda5da8dSAndroid Build Coastguard Worker <xsl:choose> 98*cda5da8dSAndroid Build Coastguard Worker <!-- The acceptation state is referred to as 'accept' in the XML, but 99*cda5da8dSAndroid Build Coastguard Worker just as '0' in the DOT. --> 100*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="@rule='accept'"> 101*cda5da8dSAndroid Build Coastguard Worker <xsl:text>0</xsl:text> 102*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 103*cda5da8dSAndroid Build Coastguard Worker <xsl:otherwise> 104*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="@rule"/> 105*cda5da8dSAndroid Build Coastguard Worker </xsl:otherwise> 106*cda5da8dSAndroid Build Coastguard Worker </xsl:choose> 107*cda5da8dSAndroid Build Coastguard Worker </xsl:variable> 108*cda5da8dSAndroid Build Coastguard Worker 109*cda5da8dSAndroid Build Coastguard Worker <!-- The edge's beginning --> 110*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="reduction-edge-start"> 111*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="state" select="$staten"/> 112*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="rule" select="$rule"/> 113*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="enabled" select="@enabled"/> 114*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 115*cda5da8dSAndroid Build Coastguard Worker 116*cda5da8dSAndroid Build Coastguard Worker <!-- The edge's tokens --> 117*cda5da8dSAndroid Build Coastguard Worker <!-- Don't show labels for the default action. In other cases, there will 118*cda5da8dSAndroid Build Coastguard Worker always be at least one token, so 'label="[]"' will not occur. --> 119*cda5da8dSAndroid Build Coastguard Worker <xsl:if test='$rule!=0 and not(../reduction[@enabled=$ena and @rule=$rule and @symbol="$default"])'> 120*cda5da8dSAndroid Build Coastguard Worker <xsl:text>label="[</xsl:text> 121*cda5da8dSAndroid Build Coastguard Worker <xsl:for-each select='../reduction[@enabled=$ena and @rule=$rule]'> 122*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="escape"> 123*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="subject" select="@symbol"/> 124*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 125*cda5da8dSAndroid Build Coastguard Worker <xsl:if test="position() != last ()"> 126*cda5da8dSAndroid Build Coastguard Worker <xsl:text>, </xsl:text> 127*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 128*cda5da8dSAndroid Build Coastguard Worker </xsl:for-each> 129*cda5da8dSAndroid Build Coastguard Worker <xsl:text>]", </xsl:text> 130*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 131*cda5da8dSAndroid Build Coastguard Worker 132*cda5da8dSAndroid Build Coastguard Worker <!-- The edge's end --> 133*cda5da8dSAndroid Build Coastguard Worker <xsl:text>style=solid] </xsl:text> 134*cda5da8dSAndroid Build Coastguard Worker 135*cda5da8dSAndroid Build Coastguard Worker <!-- The diamond representing the reduction --> 136*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="reduction-node"> 137*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="state" select="$staten"/> 138*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="rule" select="$rule"/> 139*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="color"> 140*cda5da8dSAndroid Build Coastguard Worker <xsl:choose> 141*cda5da8dSAndroid Build Coastguard Worker <xsl:when test='@enabled="true"'> 142*cda5da8dSAndroid Build Coastguard Worker <xsl:text>3</xsl:text> 143*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 144*cda5da8dSAndroid Build Coastguard Worker <xsl:otherwise> 145*cda5da8dSAndroid Build Coastguard Worker <xsl:text>5</xsl:text> 146*cda5da8dSAndroid Build Coastguard Worker </xsl:otherwise> 147*cda5da8dSAndroid Build Coastguard Worker </xsl:choose> 148*cda5da8dSAndroid Build Coastguard Worker </xsl:with-param> 149*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 150*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 151*cda5da8dSAndroid Build Coastguard Worker </xsl:for-each> 152*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 153*cda5da8dSAndroid Build Coastguard Worker 154*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="actions/transitions"> 155*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="transition"/> 156*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 157*cda5da8dSAndroid Build Coastguard Worker 158*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="item"> 159*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="prev-rule-number" 160*cda5da8dSAndroid Build Coastguard Worker select="preceding-sibling::item[1]/@rule-number"/> 161*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="key('bison:ruleByNumber', @rule-number)"> 162*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="dot" select="@dot"/> 163*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="num" select="@rule-number"/> 164*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="prev-lhs" 165*cda5da8dSAndroid Build Coastguard Worker select="key('bison:ruleByNumber', $prev-rule-number)/lhs[text()]" 166*cda5da8dSAndroid Build Coastguard Worker /> 167*cda5da8dSAndroid Build Coastguard Worker </xsl:apply-templates> 168*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="lookaheads"/> 169*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 170*cda5da8dSAndroid Build Coastguard Worker 171*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="rule"> 172*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="dot"/> 173*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="num"/> 174*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="prev-lhs"/> 175*cda5da8dSAndroid Build Coastguard Worker <xsl:text> </xsl:text> 176*cda5da8dSAndroid Build Coastguard Worker <xsl:choose> 177*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="$num < 10"> 178*cda5da8dSAndroid Build Coastguard Worker <xsl:text> </xsl:text> 179*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 180*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="$num < 100"> 181*cda5da8dSAndroid Build Coastguard Worker <xsl:text> </xsl:text> 182*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 183*cda5da8dSAndroid Build Coastguard Worker <xsl:otherwise> 184*cda5da8dSAndroid Build Coastguard Worker <xsl:text></xsl:text> 185*cda5da8dSAndroid Build Coastguard Worker </xsl:otherwise> 186*cda5da8dSAndroid Build Coastguard Worker </xsl:choose> 187*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$num"/> 188*cda5da8dSAndroid Build Coastguard Worker <xsl:text> </xsl:text> 189*cda5da8dSAndroid Build Coastguard Worker <xsl:choose> 190*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="$prev-lhs = lhs[text()]"> 191*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="lpad"> 192*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="str" select="'|'"/> 193*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="pad" select="number(string-length(lhs[text()])) + 1"/> 194*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 195*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 196*cda5da8dSAndroid Build Coastguard Worker <xsl:otherwise> 197*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="lhs"/> 198*cda5da8dSAndroid Build Coastguard Worker <xsl:text>:</xsl:text> 199*cda5da8dSAndroid Build Coastguard Worker </xsl:otherwise> 200*cda5da8dSAndroid Build Coastguard Worker </xsl:choose> 201*cda5da8dSAndroid Build Coastguard Worker <xsl:if test="$dot = 0"> 202*cda5da8dSAndroid Build Coastguard Worker <xsl:text> .</xsl:text> 203*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 204*cda5da8dSAndroid Build Coastguard Worker 205*cda5da8dSAndroid Build Coastguard Worker <!-- RHS --> 206*cda5da8dSAndroid Build Coastguard Worker <xsl:for-each select="rhs/symbol|rhs/empty"> 207*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="."/> 208*cda5da8dSAndroid Build Coastguard Worker <xsl:if test="$dot = position()"> 209*cda5da8dSAndroid Build Coastguard Worker <xsl:text> .</xsl:text> 210*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 211*cda5da8dSAndroid Build Coastguard Worker </xsl:for-each> 212*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 213*cda5da8dSAndroid Build Coastguard Worker 214*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="symbol"> 215*cda5da8dSAndroid Build Coastguard Worker <xsl:text> </xsl:text> 216*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="."/> 217*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 218*cda5da8dSAndroid Build Coastguard Worker 219*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="empty"> 220*cda5da8dSAndroid Build Coastguard Worker <xsl:text> %empty</xsl:text> 221*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 222*cda5da8dSAndroid Build Coastguard Worker 223*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="lookaheads"> 224*cda5da8dSAndroid Build Coastguard Worker <xsl:text> [</xsl:text> 225*cda5da8dSAndroid Build Coastguard Worker <xsl:apply-templates select="symbol"/> 226*cda5da8dSAndroid Build Coastguard Worker <xsl:text>]</xsl:text> 227*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 228*cda5da8dSAndroid Build Coastguard Worker 229*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="lookaheads/symbol"> 230*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="."/> 231*cda5da8dSAndroid Build Coastguard Worker <xsl:if test="position() != last()"> 232*cda5da8dSAndroid Build Coastguard Worker <xsl:text>, </xsl:text> 233*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 234*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 235*cda5da8dSAndroid Build Coastguard Worker 236*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="reduction-edge-start"> 237*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="state"/> 238*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="rule"/> 239*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="enabled"/> 240*cda5da8dSAndroid Build Coastguard Worker 241*cda5da8dSAndroid Build Coastguard Worker <xsl:text> </xsl:text> 242*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$state"/> 243*cda5da8dSAndroid Build Coastguard Worker <xsl:text> -> "</xsl:text> 244*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$state"/> 245*cda5da8dSAndroid Build Coastguard Worker <xsl:text>R</xsl:text> 246*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$rule"/> 247*cda5da8dSAndroid Build Coastguard Worker <xsl:if test='$enabled = "false"'> 248*cda5da8dSAndroid Build Coastguard Worker <xsl:text>d</xsl:text> 249*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 250*cda5da8dSAndroid Build Coastguard Worker <xsl:text>" [</xsl:text> 251*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 252*cda5da8dSAndroid Build Coastguard Worker 253*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="reduction-node"> 254*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="state"/> 255*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="rule"/> 256*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="color"/> 257*cda5da8dSAndroid Build Coastguard Worker 258*cda5da8dSAndroid Build Coastguard Worker <xsl:text> "</xsl:text> 259*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$state"/> 260*cda5da8dSAndroid Build Coastguard Worker <xsl:text>R</xsl:text> 261*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$rule"/> 262*cda5da8dSAndroid Build Coastguard Worker <xsl:if test="$color = 5"> 263*cda5da8dSAndroid Build Coastguard Worker <xsl:text>d</xsl:text> 264*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 265*cda5da8dSAndroid Build Coastguard Worker <xsl:text>" [label="</xsl:text> 266*cda5da8dSAndroid Build Coastguard Worker <xsl:choose> 267*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="$rule = 0"> 268*cda5da8dSAndroid Build Coastguard Worker <xsl:text>Acc", fillcolor=1</xsl:text> 269*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 270*cda5da8dSAndroid Build Coastguard Worker <xsl:otherwise> 271*cda5da8dSAndroid Build Coastguard Worker <xsl:text>R</xsl:text> 272*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$rule"/> 273*cda5da8dSAndroid Build Coastguard Worker <xsl:text>", fillcolor=</xsl:text> 274*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$color"/> 275*cda5da8dSAndroid Build Coastguard Worker </xsl:otherwise> 276*cda5da8dSAndroid Build Coastguard Worker </xsl:choose> 277*cda5da8dSAndroid Build Coastguard Worker <xsl:text>, shape=diamond, style=filled] </xsl:text> 278*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 279*cda5da8dSAndroid Build Coastguard Worker 280*cda5da8dSAndroid Build Coastguard Worker<xsl:template match="transition"> 281*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="output-edge"> 282*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="src" select="../../../@number"/> 283*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="dst" select="@state"/> 284*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="style"> 285*cda5da8dSAndroid Build Coastguard Worker <xsl:choose> 286*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="@symbol = 'error'"> 287*cda5da8dSAndroid Build Coastguard Worker <xsl:text>dotted</xsl:text> 288*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 289*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="@type = 'shift'"> 290*cda5da8dSAndroid Build Coastguard Worker <xsl:text>solid</xsl:text> 291*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 292*cda5da8dSAndroid Build Coastguard Worker <xsl:otherwise> 293*cda5da8dSAndroid Build Coastguard Worker <xsl:text>dashed</xsl:text> 294*cda5da8dSAndroid Build Coastguard Worker </xsl:otherwise> 295*cda5da8dSAndroid Build Coastguard Worker </xsl:choose> 296*cda5da8dSAndroid Build Coastguard Worker </xsl:with-param> 297*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="label"> 298*cda5da8dSAndroid Build Coastguard Worker <xsl:if test="not(@symbol = 'error')"> 299*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="@symbol"/> 300*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 301*cda5da8dSAndroid Build Coastguard Worker </xsl:with-param> 302*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 303*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 304*cda5da8dSAndroid Build Coastguard Worker 305*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="output-node"> 306*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="number"/> 307*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="label"/> 308*cda5da8dSAndroid Build Coastguard Worker <xsl:text> </xsl:text> 309*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$number"/> 310*cda5da8dSAndroid Build Coastguard Worker <xsl:text> [label="</xsl:text> 311*cda5da8dSAndroid Build Coastguard Worker <xsl:text>State </xsl:text> 312*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$number"/> 313*cda5da8dSAndroid Build Coastguard Worker <xsl:text>\n</xsl:text> 314*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="escape"> 315*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="subject" select="$label"/> 316*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 317*cda5da8dSAndroid Build Coastguard Worker <xsl:text>\l"] </xsl:text> 318*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 319*cda5da8dSAndroid Build Coastguard Worker 320*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="output-edge"> 321*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="src"/> 322*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="dst"/> 323*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="style"/> 324*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="label"/> 325*cda5da8dSAndroid Build Coastguard Worker <xsl:text> </xsl:text> 326*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$src"/> 327*cda5da8dSAndroid Build Coastguard Worker <xsl:text> -> </xsl:text> 328*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$dst"/> 329*cda5da8dSAndroid Build Coastguard Worker <xsl:text> [style=</xsl:text> 330*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$style"/> 331*cda5da8dSAndroid Build Coastguard Worker <xsl:if test="$label and $label != ''"> 332*cda5da8dSAndroid Build Coastguard Worker <xsl:text> label="</xsl:text> 333*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="escape"> 334*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="subject" select="$label"/> 335*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 336*cda5da8dSAndroid Build Coastguard Worker <xsl:text>"</xsl:text> 337*cda5da8dSAndroid Build Coastguard Worker </xsl:if> 338*cda5da8dSAndroid Build Coastguard Worker <xsl:text>] </xsl:text> 339*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 340*cda5da8dSAndroid Build Coastguard Worker 341*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="escape"> 342*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="subject"/> <!-- required --> 343*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="string-replace"> 344*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="subject"> 345*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="string-replace"> 346*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="subject"> 347*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="string-replace"> 348*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="subject" select="$subject"/> 349*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="search" select="'\'"/> 350*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="replace" select="'\\'"/> 351*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 352*cda5da8dSAndroid Build Coastguard Worker </xsl:with-param> 353*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="search" select="'"'"/> 354*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="replace" select="'\"'"/> 355*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 356*cda5da8dSAndroid Build Coastguard Worker </xsl:with-param> 357*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="search" select="' '"/> 358*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="replace" select="'\l'"/> 359*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 360*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 361*cda5da8dSAndroid Build Coastguard Worker 362*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="string-replace"> 363*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="subject"/> 364*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="search"/> 365*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="replace"/> 366*cda5da8dSAndroid Build Coastguard Worker <xsl:choose> 367*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="contains($subject, $search)"> 368*cda5da8dSAndroid Build Coastguard Worker <xsl:variable name="before" select="substring-before($subject, $search)"/> 369*cda5da8dSAndroid Build Coastguard Worker <xsl:variable name="after" select="substring-after($subject, $search)"/> 370*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$before"/> 371*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$replace"/> 372*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="string-replace"> 373*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="subject" select="$after"/> 374*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="search" select="$search"/> 375*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="replace" select="$replace"/> 376*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 377*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 378*cda5da8dSAndroid Build Coastguard Worker <xsl:otherwise> 379*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$subject"/> 380*cda5da8dSAndroid Build Coastguard Worker </xsl:otherwise> 381*cda5da8dSAndroid Build Coastguard Worker </xsl:choose> 382*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 383*cda5da8dSAndroid Build Coastguard Worker 384*cda5da8dSAndroid Build Coastguard Worker<xsl:template name="lpad"> 385*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="str" select="''"/> 386*cda5da8dSAndroid Build Coastguard Worker <xsl:param name="pad" select="0"/> 387*cda5da8dSAndroid Build Coastguard Worker <xsl:variable name="diff" select="$pad - string-length($str)" /> 388*cda5da8dSAndroid Build Coastguard Worker <xsl:choose> 389*cda5da8dSAndroid Build Coastguard Worker <xsl:when test="$diff < 0"> 390*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$str"/> 391*cda5da8dSAndroid Build Coastguard Worker </xsl:when> 392*cda5da8dSAndroid Build Coastguard Worker <xsl:otherwise> 393*cda5da8dSAndroid Build Coastguard Worker <xsl:call-template name="space"> 394*cda5da8dSAndroid Build Coastguard Worker <xsl:with-param name="repeat" select="$diff"/> 395*cda5da8dSAndroid Build Coastguard Worker </xsl:call-template> 396*cda5da8dSAndroid Build Coastguard Worker <xsl:value-of select="$str"/> 397*cda5da8dSAndroid Build Coastguard Worker </xsl:otherwise> 398*cda5da8dSAndroid Build Coastguard Worker </xsl:choose> 399*cda5da8dSAndroid Build Coastguard Worker</xsl:template> 400*cda5da8dSAndroid Build Coastguard Worker 401*cda5da8dSAndroid Build Coastguard Worker</xsl:stylesheet> 402