yml2/xml2yml.ysl2
author Edouard Tisserant <edouard.tisserant@gmail.com>
Wed, 28 Apr 2021 23:40:51 +0200
changeset 78 0b05c2bce9e4
parent 43 fb35b9db9ca1
permissions -rw-r--r--
Fix expension of macros in pointers with default values.

For example :

in xsl decl widget_class(%name, *clsname="%nameWidget", match="widget[@type='%name']", mode="widget_class") alias template {
| class `text **clsname` extends Widget{
content;
| }
};

widget_class('Input');

gives now :

<xsl:template match="widget[@type='Input']" mode="widget_class">
<xsl:text>class </xsl:text>
<xsl:text>InputWidget</xsl:text>
<xsl:text> extends Widget{
</xsl:text>
<xsl:text>}
</xsl:text>
</xsl:template>

Without the fix, <xsl:text>InputWidget</xsl:text> would be <xsl:text>%nameWidget</xsl:text>
// xml2yml2.ysl2 version 2.4.4

include yslt.yml2

decl textstylesheet is estylesheet(*output="text") {
    output *output;
    const "space", !"'" + " " * 200 + "'"!;
    param "autoindent", 4;
    content;
}, tstylesheet is textstylesheet;

define operator "†" as call "convert" with "tag", "name()";

tstylesheet {
    function "printNS"
        for "*/namespace::*[local-name()!='xml']" {
            > xmlns
            if "not(local-name()='')"
                > :«local-name()»
            > ="«.»"
            if "position()<last()" > , 
        }
    
    template "/" {
        if "count(*/namespace::*)>1" {
            | decl «name(*)»(`call "printNS"`);
            |
        }
        apply "*", 0;
    }

    template "text()" {
        param "text", "normalize-space()";

        if "string-length($text)>0" choose {
            when "contains($text,'\\n')" choose {
                when "string-length(substring-before($text,'\\n'))<string-length($text)-1" choose {
                    when "substring($text,string-length($text),1)='\\n'"
                        > \n||\n«$text»||\n\n
                    otherwise > > «str:replace($text,'\\n','\\\\n')»\n
                }
                otherwise > | «$text»\n
            }
            otherwise > > `copy "."`\n
        }
    }

    template "*" {
        0>
        call "convert" with "tag", "name()";
        apply "@*";

        choose {
            when "count(*)=0 and string-length(normalize-space())=0"
                > ;\n
            when "count(*)=1 and string-length(normalize-space())=0" {
                > \n
                apply "*";
            }
            when "count(*)=0 and string-length(normalize-space())>0" {
                >  
                apply "text()";
            }
            otherwise {
                >  {\n
                for "*|text()" {
                    if "local-name()=''"
                        if "string-length(normalize-space())>0"
                            1>
                    apply ".";
                }
                | }
            }
        }
    }

    template "@*" {
        >  «name()»="«.»"
        if "position()<last()" > ,
    }

    function "convert" {
        param "tag";

        > «translate($tag, '-', '_')»
    }
}