|  | X:stylesheet { | 
|  |  | 
|  | X:output method="text"; | 
|  |  | 
|  | X:param lang="'en'"; | 
|  | X:param configuration="'../xml/change_log_conf.xml'"; | 
|  |  | 
|  | X:var conf = "document($configuration)/configuration"; | 
|  | X:var start = "$conf/start"; | 
|  | X:var indent = "$conf/indent"; | 
|  | X:var max = "$conf/length"; | 
|  | X:var br = {<br>} | 
|  |  | 
|  |  | 
|  | X:template = "/" { !! "change_log"; } | 
|  | X:template = "change_log" { !! "changes"; } | 
|  |  | 
|  |  | 
|  | X:template = "changes" { | 
|  | X:text {
} | 
|  |  | 
|  | !{substring(concat($conf/changes[@lang=$lang]/title, | 
|  | //change_log/@title, | 
|  | ' ', @ver, | 
|  | '                                                    '), | 
|  | 1, $conf/changes[@lang=$lang]/length)} | 
|  |  | 
|  | X:if "$lang='ru'" { !{@date} } | 
|  |  | 
|  | X:if "$lang='en'" { | 
|  | !{substring(@date, 1, 2)} | 
|  | !{$conf/changes[@lang=$lang]/month[number(substring(current()/@date, | 
|  | 4, 2))]} | 
|  | !{substring(@date, 7, 4)} | 
|  | } | 
|  |  | 
|  | X:text {
} | 
|  |  | 
|  | !! "change"; | 
|  |  | 
|  | X:text {
} | 
|  | } | 
|  |  | 
|  |  | 
|  | X:template = "change" { | 
|  | X:var prefix = "$conf/changes[@lang=$lang]/*[local-name(.)=current()/@type]" | 
|  |  | 
|  | X:var postfix = { X:if "$prefix" { X:text {: } } } | 
|  |  | 
|  | !! "para[@lang=$lang]" (prefix = "concat($start, $prefix, $postfix)"); | 
|  | } | 
|  |  | 
|  |  | 
|  | X:template para(prefix) = "para" { | 
|  | X:var text = { !!; } | 
|  |  | 
|  | X:text {
} | 
|  |  | 
|  | !wrap(text = "normalize-space($text)", | 
|  | prefix = { X:if "position() = 1" { !{$prefix} } else { !{$indent} } }) | 
|  | } | 
|  |  | 
|  |  | 
|  | X:template wrap(text, prefix) { | 
|  | X:if "$text" { | 
|  | X:var offset = { | 
|  | X:choose { | 
|  | X:when "starts-with($text, concat($br, ' '))" { | 
|  | !{string-length($br) + 2} | 
|  | } | 
|  | X:when "starts-with($text, $br)" { | 
|  | !{string-length($br) + 1} | 
|  | } | 
|  | X:otherwise { | 
|  | 1 | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | X:var length = { | 
|  | !length(text = "substring($text, $offset)", | 
|  | prefix = "string-length($prefix)", | 
|  | length = "$max") | 
|  | } | 
|  |  | 
|  | !{$prefix} | 
|  |  | 
|  | !{normalize-space(translate(substring($text, $offset, $length), | 
|  | ' ', ' '))} | 
|  |  | 
|  | X:text {
} | 
|  |  | 
|  | !wrap(text = "substring($text, $length + $offset)", prefix = "$indent") | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | X:template length(text, prefix, length) { | 
|  | X:var break = "substring-before(substring($text, 1, | 
|  | $length - $prefix + string-length($br)), | 
|  | $br)" | 
|  |  | 
|  | X:choose { | 
|  | X:when "$break" { !{string-length($break)} } | 
|  |  | 
|  | X:when "$length = 0" { !{$max - $prefix} } | 
|  |  | 
|  | X:when "string-length($text) + $prefix <= $length" { | 
|  | !{$length - $prefix} | 
|  | } | 
|  |  | 
|  | X:when "substring($text, $length - $prefix + 1, 1) = ' '" { | 
|  | !{$length - $prefix + 1} | 
|  | } | 
|  |  | 
|  | X:otherwise { | 
|  | !length(text = "$text", prefix = "$prefix", length = "$length - 1") | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | X:template = "at" {@} | 
|  | X:template = "br" { !{$br} } | 
|  | X:template = "nobr" { !{translate(., ' ', ' ')} } | 
|  |  | 
|  |  | 
|  | } |