yslt.yml2
author Volker Birk <vb@pep-project.org>
Mon, 04 Nov 2019 11:36:06 +0100
changeset 38 90d687cbe277
parent 9 0250d70228bc
child 40 432ab62b2537
permissions -rw-r--r--
explicitely name match attribute
// YSLT version 2.5.5

!!
def indent(level):
    return "value 'substring($space, 1, $_indent+" + str(level) + "*$autoindent)';"
!!

in exsl decl document(href, method) alias document;
in func decl def(name) alias function, result(select);

decl debug_off(exclude-result-prefixes="yml");

in xsl {
    decl _trace_param(%text, name="yml:trace", select='yml:debug("* %text")') alias param;
    decl _trace_with is _trace_param alias with-param;

    decl param(name, select);
    decl const(name, select) alias variable, variable is const;
    decl output(method), key(name, match, use);
    decl value(select) alias value-of, copy(select) alias copy-of;

    decl indent is value(%level, select='substring($space, 1, $_indent + (%level) * $autoindent)');

    decl stylesheet(
        *output="xml",
        version="1.0",
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    ) {
        output *output;
        const "space", !"'" + " " * 200 + "'"!;
        param "autoindent", 4;
        content;
    };

    decl estylesheet is stylesheet (
        xmlns:exsl='http://exslt.org/common',
        xmlns:math='http://exslt.org/math',
        xmlns:func='http://exslt.org/functions',
        xmlns:str='http://exslt.org/strings',
        xmlns:dyn='http://exslt.org/dynamic',
        xmlns:set='http://exslt.org/sets',
        xmlns:sets='http://exslt.org/sets',
        xmlns:date='http://exslt.org/dates-and-times',
        xmlns:yml='http://fdik.org/yml',
        extension-element-prefixes='exsl func str dyn set sets math date yml'
    );

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

    decl template(match) {
        _trace_param *_trace_info;
        param "_indent", 0;
        content;
    };

    decl function(name) alias template {
        _trace_param *_trace_info;
        param "_indent", 0;
        content;
    };
   
    decl call(name) alias call-template {
        _trace_with *_trace_info;
        content;
    };

    decl namespace_alias(stylesheet-prefix, result-prefix);
    decl text, raw(disable-output-escaping='yes') alias text;

    decl with(name, select) alias with-param;
    decl withIndent(%level, name="_indent", select='$_indent + (%level) * $autoindent') alias with-param;

    decl apply(select, *indent=1) alias apply-templates {
        _trace_with *_trace_info;
        withIndent *indent;
        content;
    };

    decl choose, when(test), otherwise;
    decl if(test);
    decl for(select) alias for-each, foreach is for;
    decl element(name, namespace);
    decl attrib(name, namespace) alias attribute, attrib_set(name) alias attribute-set;
    decl processing(name) alias processing-instruction;
    decl comment;
    decl number(value), sort(select), decimal_format(name, decimal-separator=".", grouping-separator=",");
    decl import(href), fallback;
    decl message, error is message(terminate='yes'), warning is message(terminate='no');

    decl debug(%text, select='yml:debug(%text)') alias value-of;
    decl assert(%test, %msg="''", select='yml:assert(%test,%msg)') alias value-of;
}

define operator "«(.*?)»" as value "%1";