xml2yml.ysl2
author Volker Birk <vb@pep-project.org>
Fri, 15 Feb 2019 10:45:50 +0100
changeset 29 6a8a7951d8e6
parent 0 76005e62091d
permissions -rw-r--r--
feature: default function is used as a template
// 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, '-', '_')»
    }
}