packages feed

hxt-8.0.0: doc/hdoc/src/Text-XML-HXT-XSLT-Compilation.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>Haskell Code by HsColour</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
<pre><a name="line-1"></a><span class='comment'>-- ------------------------------------------------------------</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='comment'>{- |
<a name="line-4"></a>   Module     : Text.XML.HXT.XSLT.Application
<a name="line-5"></a>   Copyright  : Copyright (C) 2006 Tim Walkenhorst, Uwe Schmidt
<a name="line-6"></a>   License    : MIT
<a name="line-7"></a>
<a name="line-8"></a>   Maintainer : Uwe Schmidt (uwe\@fh-wedel.de)
<a name="line-9"></a>   Stability  : experimental
<a name="line-10"></a>   Portability: portable
<a name="line-11"></a>   Version    : $Id: Compilation.hs,v 1.7 2007/05/02 06:41:05 hxml Exp $
<a name="line-12"></a>
<a name="line-13"></a>   The compilation functions for XSLT stylesheets
<a name="line-14"></a>
<a name="line-15"></a>-}</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='comment'>-- ------------------------------------------------------------</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='keyword'>module</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>XSLT</span><span class='varop'>.</span><span class='conid'>Compilation</span> 
<a name="line-20"></a>    <span class='layout'>(</span> <span class='varid'>prepareXSLTDocument</span>        <span class='comment'>-- :: XmlTree -&gt; XmlTree</span>
<a name="line-21"></a>    <span class='layout'>,</span> <span class='varid'>assembleStylesheet</span>         <span class='comment'>-- :: XmlTree -&gt; [CompiledStylesheet] -&gt; CompiledStylesheet</span>
<a name="line-22"></a>    <span class='layout'>)</span>
<a name="line-23"></a><span class='keyword'>where</span>
<a name="line-24"></a>
<a name="line-25"></a><span class='keyword'>import</span> <span class='conid'>Control</span><span class='varop'>.</span><span class='conid'>Monad</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='keyword'>import</span> <span class='conid'>Data</span><span class='varop'>.</span><span class='conid'>Maybe</span>
<a name="line-28"></a><span class='keyword'>import</span> <span class='conid'>Data</span><span class='varop'>.</span><span class='conid'>Either</span>
<a name="line-29"></a><span class='keyword'>import</span> <span class='conid'>Data</span><span class='varop'>.</span><span class='conid'>List</span>
<a name="line-30"></a><span class='keyword'>import</span> <span class='keyword'>qualified</span> <span class='conid'>Data</span><span class='varop'>.</span><span class='conid'>Map</span> <span class='keyword'>as</span> <span class='conid'>Map</span> <span class='varid'>hiding</span> <span class='layout'>(</span><span class='conid'>Map</span><span class='layout'>)</span>
<a name="line-31"></a><span class='keyword'>import</span> <span class='conid'>Data</span><span class='varop'>.</span><span class='conid'>Map</span><span class='layout'>(</span><span class='conid'>Map</span><span class='layout'>)</span>
<a name="line-32"></a>
<a name="line-33"></a><span class='keyword'>import</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>ParserCombinators</span><span class='varop'>.</span><span class='conid'>Parsec</span><span class='varop'>.</span><span class='conid'>Prim</span><span class='layout'>(</span><span class='varid'>runParser</span><span class='layout'>)</span>
<a name="line-34"></a>
<a name="line-35"></a><span class='keyword'>import</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>XSLT</span><span class='varop'>.</span><span class='conid'>Common</span>
<a name="line-36"></a><span class='keyword'>import</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>XSLT</span><span class='varop'>.</span><span class='conid'>Names</span>
<a name="line-37"></a><span class='keyword'>import</span> <span class='conid'>Text</span><span class='varop'>.</span><span class='conid'>XML</span><span class='varop'>.</span><span class='conid'>HXT</span><span class='varop'>.</span><span class='conid'>XSLT</span><span class='varop'>.</span><span class='conid'>CompiledStylesheet</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='comment'>-- No deep meaning just a shortcut notation for a *very* common expression...</span>
<a name="line-40"></a>
<a name="line-41"></a><span class='keyword'>infixl</span> <span class='num'>9</span> <span class='varop'>&gt;&lt;</span>
<a name="line-42"></a>
<a name="line-43"></a><a name="><"></a><span class='layout'>(</span><span class='varop'>&gt;&lt;</span><span class='layout'>)</span>	<span class='keyglyph'>::</span> <span class='conid'>XmlNode</span> <span class='varid'>n</span> <span class='keyglyph'>=&gt;</span> <span class='layout'>(</span><span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='varid'>a</span> <span class='layout'>)</span> <span class='keyglyph'>-&gt;</span> <span class='varid'>n</span> <span class='keyglyph'>-&gt;</span> <span class='varid'>a</span>
<a name="line-44"></a><a name="f"></a><span class='definition'>f</span> <span class='varop'>&gt;&lt;</span> <span class='varid'>node</span>
<a name="line-45"></a>    <span class='keyglyph'>=</span> <span class='varid'>f</span> <span class='varop'>$</span> <span class='varid'>getUriMap</span> <span class='varid'>node</span>
<a name="line-46"></a>
<a name="line-47"></a><span class='comment'>-- --------------------------</span>
<a name="line-48"></a>
<a name="line-49"></a><a name="parseExpr"></a><span class='definition'>parseExpr</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Expr</span>
<a name="line-50"></a><span class='definition'>parseExpr</span> <span class='varid'>uris</span> <span class='varid'>selectStr</span>
<a name="line-51"></a>    <span class='keyglyph'>=</span> <span class='varid'>either</span> <span class='layout'>(</span><span class='varid'>error</span><span class='varop'>.</span><span class='varid'>show</span><span class='layout'>)</span> <span class='varid'>id</span> <span class='varid'>parseResult</span>                               
<a name="line-52"></a>    <span class='keyword'>where</span>
<a name="line-53"></a>    <span class='varid'>parseResult</span> <span class='keyglyph'>=</span> <span class='varid'>runParser</span> <span class='varid'>parseXPath</span> <span class='layout'>(</span><span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>toList</span> <span class='varid'>uris</span><span class='layout'>)</span> <span class='layout'>(</span><span class='str'>"select-expr:"</span><span class='varop'>++</span><span class='varid'>selectStr</span><span class='layout'>)</span> <span class='varid'>selectStr</span> 
<a name="line-54"></a>
<a name="line-55"></a><a name="parseSelect"></a><span class='definition'>parseSelect</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>SelectExpr</span>
<a name="line-56"></a><span class='definition'>parseSelect</span> <span class='varid'>uris</span>
<a name="line-57"></a>    <span class='keyglyph'>=</span> <span class='conid'>SelectExpr</span> <span class='varop'>.</span> <span class='varid'>parseExpr</span> <span class='varid'>uris</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="parseTest"></a><span class='definition'>parseTest</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>TestExpr</span>
<a name="line-60"></a><span class='definition'>parseTest</span> <span class='varid'>uris</span>
<a name="line-61"></a>    <span class='keyglyph'>=</span> <span class='conid'>TestExpr</span> <span class='varop'>.</span> <span class='varid'>mkBoolExpr</span> <span class='varop'>.</span> <span class='varid'>parseExpr</span> <span class='varid'>uris</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="parseStringExpr"></a><span class='definition'>parseStringExpr</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>StringExpr</span>
<a name="line-64"></a><span class='definition'>parseStringExpr</span> <span class='varid'>uris</span>
<a name="line-65"></a>    <span class='keyglyph'>=</span> <span class='conid'>StringExpr</span> <span class='varop'>.</span> <span class='varid'>mkStringExpr</span> <span class='varop'>.</span> <span class='varid'>parseExpr</span> <span class='varid'>uris</span>
<a name="line-66"></a>
<a name="line-67"></a><a name="parseMatch"></a><span class='definition'>parseMatch</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>MatchExpr</span>
<a name="line-68"></a><span class='definition'>parseMatch</span> <span class='varid'>uris</span> <span class='varid'>str</span>
<a name="line-69"></a>    <span class='keyglyph'>=</span> <span class='keyword'>if</span> <span class='varid'>isMatchExpr</span> <span class='varid'>expr</span>
<a name="line-70"></a>      <span class='keyword'>then</span> <span class='conid'>MatchExpr</span> <span class='varid'>expr</span>
<a name="line-71"></a>      <span class='keyword'>else</span> <span class='varid'>error</span> <span class='varop'>$</span> <span class='varid'>str</span> <span class='varop'>++</span> <span class='str'>" is not a legal match-expression"</span>
<a name="line-72"></a>    <span class='keyword'>where</span> 
<a name="line-73"></a>    <span class='varid'>expr</span> <span class='keyglyph'>=</span> <span class='varid'>parseExpr</span> <span class='varid'>uris</span> <span class='varid'>str</span>
<a name="line-74"></a>
<a name="line-75"></a><span class='comment'>-- --------------------------</span>
<a name="line-76"></a>
<a name="line-77"></a><a name="parseAVT"></a><span class='definition'>parseAVT</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>StringExpr</span>
<a name="line-78"></a><span class='definition'>parseAVT</span> <span class='varid'>uris</span> <span class='varid'>str</span> <span class='keyglyph'>=</span> 
<a name="line-79"></a>    <span class='conid'>StringExpr</span> <span class='varop'>$</span> <span class='varid'>concatExpr</span> <span class='varop'>$</span> <span class='varid'>splitAVT</span> <span class='varid'>str</span> <span class='str'>""</span>
<a name="line-80"></a>  <span class='keyword'>where</span>
<a name="line-81"></a>
<a name="line-82"></a>    <span class='varid'>splitAVT</span> <span class='keyglyph'>::</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>Expr</span><span class='keyglyph'>]</span>
<a name="line-83"></a>    <span class='varid'>splitAVT</span> <span class='str'>""</span>           <span class='varid'>acc</span> <span class='keyglyph'>=</span> <span class='varid'>acc2lit</span> <span class='varid'>acc</span>
<a name="line-84"></a>    <span class='varid'>splitAVT</span> <span class='layout'>(</span><span class='chr'>'{'</span><span class='conop'>:</span><span class='chr'>'{'</span><span class='conop'>:</span><span class='varid'>xs</span><span class='layout'>)</span> <span class='varid'>acc</span> <span class='keyglyph'>=</span> <span class='varid'>splitAVT</span> <span class='varid'>xs</span> <span class='varop'>$</span> <span class='chr'>'{'</span><span class='conop'>:</span><span class='varid'>acc</span>
<a name="line-85"></a>    <span class='varid'>splitAVT</span> <span class='layout'>(</span><span class='chr'>'}'</span><span class='conop'>:</span><span class='chr'>'}'</span><span class='conop'>:</span><span class='varid'>xs</span><span class='layout'>)</span> <span class='varid'>acc</span> <span class='keyglyph'>=</span> <span class='varid'>splitAVT</span> <span class='varid'>xs</span> <span class='varop'>$</span> <span class='chr'>'}'</span><span class='conop'>:</span><span class='varid'>acc</span>
<a name="line-86"></a>    <span class='varid'>splitAVT</span> <span class='layout'>(</span><span class='chr'>'{'</span><span class='conop'>:</span><span class='varid'>xs</span><span class='layout'>)</span>     <span class='varid'>acc</span> <span class='keyglyph'>=</span> <span class='keyword'>let</span> <span class='layout'>(</span><span class='varid'>body</span><span class='layout'>,</span> <span class='varid'>rest</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>span</span> <span class='layout'>(</span><span class='varop'>`notElem`</span> <span class='str'>"{}"</span><span class='layout'>)</span> <span class='varid'>xs</span> <span class='keyword'>in</span>
<a name="line-87"></a>                                  <span class='keyword'>if</span> <span class='varid'>not</span> <span class='layout'>(</span><span class='varid'>null</span> <span class='varid'>rest</span><span class='layout'>)</span> <span class='varop'>&amp;&amp;</span> <span class='varid'>head</span> <span class='varid'>rest</span> <span class='varop'>==</span> <span class='chr'>'}'</span>
<a name="line-88"></a>                                    <span class='keyword'>then</span> <span class='varid'>acc2lit</span> <span class='varid'>acc</span> <span class='varop'>++</span> <span class='varid'>parseExpr</span> <span class='varid'>uris</span> <span class='varid'>body</span> <span class='conop'>:</span> <span class='varid'>splitAVT</span> <span class='layout'>(</span><span class='varid'>tail</span> <span class='varid'>rest</span><span class='layout'>)</span> <span class='str'>""</span>
<a name="line-89"></a>                                    <span class='keyword'>else</span> <span class='varid'>error</span> <span class='varop'>$</span> <span class='str'>"Unterminated expression "</span> <span class='varop'>++</span> <span class='varid'>xs</span> <span class='varop'>++</span> <span class='str'>" in AVT."</span>
<a name="line-90"></a>    <span class='varid'>splitAVT</span> <span class='layout'>(</span><span class='chr'>'}'</span><span class='conop'>:</span><span class='keyword'>_</span><span class='layout'>)</span>      <span class='keyword'>_</span>   <span class='keyglyph'>=</span> <span class='varid'>error</span> <span class='varop'>$</span> <span class='str'>"deserted '}' in AVT."</span>
<a name="line-91"></a>    <span class='varid'>splitAVT</span> <span class='layout'>(</span><span class='varid'>x</span><span class='conop'>:</span><span class='varid'>xs</span><span class='layout'>)</span>       <span class='varid'>acc</span> <span class='keyglyph'>=</span> <span class='varid'>splitAVT</span> <span class='varid'>xs</span> <span class='varop'>$</span> <span class='varid'>x</span><span class='conop'>:</span><span class='varid'>acc</span>
<a name="line-92"></a>
<a name="line-93"></a>    <span class='varid'>acc2lit</span> <span class='keyglyph'>::</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>Expr</span><span class='keyglyph'>]</span> 
<a name="line-94"></a>    <span class='varid'>acc2lit</span> <span class='str'>""</span>  <span class='keyglyph'>=</span> <span class='conid'>[]</span>
<a name="line-95"></a>    <span class='varid'>acc2lit</span> <span class='varid'>acc</span> <span class='keyglyph'>=</span> <span class='keyglyph'>[</span><span class='varid'>mkLiteralExpr</span> <span class='varop'>$</span> <span class='varid'>reverse</span> <span class='varid'>acc</span><span class='keyglyph'>]</span>
<a name="line-96"></a>
<a name="line-97"></a><span class='comment'>-- --------------------------</span>
<a name="line-98"></a>
<a name="line-99"></a><a name="compileComputedQName"></a><span class='comment'>-- extract ComputedQName from "name" and "namespace" AVTs of an xsl:element- or xsl-attribute-node</span>
<a name="line-100"></a><span class='definition'>compileComputedQName</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>ComputedQName</span>
<a name="line-101"></a><span class='definition'>compileComputedQName</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-102"></a>    <span class='layout'>(</span><span class='conid'>CompQName</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span><span class='layout'>)</span> <span class='varid'>nameAVT</span> <span class='varid'>nsAVT</span>
<a name="line-103"></a>  <span class='keyword'>where</span> 
<a name="line-104"></a>    <span class='varid'>nameAVT</span>  <span class='keyglyph'>=</span> <span class='varid'>parseAVT</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltName</span>
<a name="line-105"></a>    <span class='varid'>nsAVT</span>    <span class='keyglyph'>=</span> <span class='varid'>parseAVT</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltNamespace</span> <span class='str'>""</span>
<a name="line-106"></a>
<a name="line-107"></a><span class='comment'>-- --------------------------</span>
<a name="line-108"></a>
<a name="line-109"></a><a name="compileComposite"></a><span class='definition'>compileComposite</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-110"></a><span class='definition'>compileComposite</span> <span class='keyglyph'>=</span> <span class='conid'>TemplComposite</span> <span class='varop'>.</span> <span class='varid'>map</span> <span class='layout'>(</span><span class='varid'>compileTemplate</span> <span class='varop'>.</span> <span class='varid'>return</span><span class='layout'>)</span>
<a name="line-111"></a>
<a name="line-112"></a><a name="compileMessage"></a><span class='definition'>compileMessage</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-113"></a><span class='definition'>compileMessage</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> <span class='conid'>TemplMessage</span> <span class='varid'>halt</span> <span class='varid'>content</span>
<a name="line-114"></a>  <span class='keyword'>where</span> <span class='varid'>halt</span>     <span class='keyglyph'>=</span> <span class='varid'>termAttr</span> <span class='varop'>==</span> <span class='str'>"yes"</span>
<a name="line-115"></a>        <span class='varid'>termAttr</span> <span class='keyglyph'>=</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltTerminate</span> <span class='str'>"no"</span>
<a name="line-116"></a>        <span class='varid'>content</span>  <span class='keyglyph'>=</span> <span class='varid'>compileTemplate</span> <span class='layout'>(</span><span class='varid'>getChildren</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-117"></a>
<a name="line-118"></a><a name="compileForEach"></a><span class='definition'>compileForEach</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-119"></a><span class='definition'>compileForEach</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> <span class='conid'>TemplForEach</span> <span class='varid'>expr</span> <span class='varid'>sorting</span> <span class='varid'>template</span>
<a name="line-120"></a>  <span class='keyword'>where</span> <span class='varid'>expr</span>       <span class='keyglyph'>=</span> <span class='varid'>parseSelect</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltSelect</span>
<a name="line-121"></a>        <span class='varid'>sorting</span>    <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>compileSortKey</span> <span class='varid'>srt</span>
<a name="line-122"></a>        <span class='varid'>template</span>   <span class='keyglyph'>=</span> <span class='varid'>compileTemplate</span> <span class='varid'>cnt</span>
<a name="line-123"></a>        <span class='layout'>(</span><span class='varid'>srt</span><span class='layout'>,</span> <span class='varid'>cnt</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>partition</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltSort</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-124"></a>
<a name="line-125"></a><a name="compileChoose"></a><span class='definition'>compileChoose</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-126"></a><span class='definition'>compileChoose</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> <span class='conid'>TemplChoose</span> <span class='varid'>whenParts</span>
<a name="line-127"></a>  <span class='keyword'>where</span> <span class='varid'>whenParts</span>  <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>compl</span> <span class='varid'>children</span>
<a name="line-128"></a>        <span class='varid'>children</span>   <span class='keyglyph'>=</span> <span class='varid'>filter</span> <span class='varid'>isElem</span> <span class='layout'>(</span><span class='varid'>getChildren</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-129"></a>        <span class='varid'>compl</span> <span class='varid'>node'</span> <span class='keyglyph'>=</span> <span class='keyword'>let</span> <span class='varid'>elemName</span> <span class='keyglyph'>=</span> <span class='varid'>fromJust</span> <span class='varop'>$</span> <span class='varid'>getElemName</span> <span class='varid'>node'</span> <span class='keyword'>in</span>
<a name="line-130"></a>                        <span class='keyword'>if</span>      <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltWhen</span>      <span class='keyword'>then</span> <span class='varid'>compileWhen</span> <span class='varid'>node'</span>
<a name="line-131"></a>                        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltOtherwise</span> <span class='keyword'>then</span> <span class='varid'>compileOtherwise</span> <span class='varid'>node'</span>
<a name="line-132"></a>                        <span class='keyword'>else</span> <span class='varid'>error</span> <span class='layout'>(</span><span class='str'>"No elements of type "</span> <span class='varop'>++</span> <span class='varid'>show</span> <span class='varid'>elemName</span> <span class='varop'>++</span> <span class='str'>" allowed within xsl-choose template!"</span><span class='layout'>)</span>
<a name="line-133"></a>
<a name="line-134"></a><a name="compileWhen"></a><span class='definition'>compileWhen</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>When</span>
<a name="line-135"></a><span class='definition'>compileWhen</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> <span class='conid'>WhenPart</span> <span class='varid'>expr</span> <span class='varop'>$</span> <span class='varid'>compileTemplate</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-136"></a>  <span class='keyword'>where</span> <span class='varid'>expr</span>     <span class='keyglyph'>=</span> <span class='varid'>parseTest</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltTest</span>
<a name="line-137"></a>
<a name="line-138"></a><a name="compileOtherwise"></a><span class='comment'>-- Otherwise is treated as a when-Part with node-test "true()"</span>
<a name="line-139"></a><span class='definition'>compileOtherwise</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>When</span>
<a name="line-140"></a><span class='definition'>compileOtherwise</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> <span class='conid'>WhenPart</span> <span class='layout'>(</span><span class='conid'>TestExpr</span> <span class='varid'>mkTrueExpr</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>compileTemplate</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-141"></a>
<a name="line-142"></a><a name="compileIf"></a><span class='comment'>-- "if" is treated as a convenience-form of choose with exactly one "when"-Part</span>
<a name="line-143"></a><span class='definition'>compileIf</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-144"></a><span class='definition'>compileIf</span> <span class='keyglyph'>=</span> <span class='conid'>TemplChoose</span> <span class='varop'>.</span> <span class='varid'>return</span> <span class='varop'>.</span> <span class='varid'>compileWhen</span>
<a name="line-145"></a>
<a name="line-146"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-147"></a>
<a name="line-148"></a><a name="parseExNames"></a><span class='definition'>parseExNames</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>ExName</span><span class='keyglyph'>]</span>
<a name="line-149"></a><span class='definition'>parseExNames</span> <span class='varid'>urm</span> <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='layout'>(</span><span class='varid'>parseExName</span> <span class='varid'>urm</span><span class='layout'>)</span> <span class='varop'>.</span> <span class='varid'>words</span>
<a name="line-150"></a>
<a name="line-151"></a><a name="compileElement"></a><span class='definition'>compileElement</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-152"></a><span class='definition'>compileElement</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> 
<a name="line-153"></a>    <span class='conid'>TemplElement</span> <span class='varid'>compQName</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>empty</span> <span class='varid'>attribSets</span> <span class='varid'>template</span>
<a name="line-154"></a>  <span class='keyword'>where</span> 
<a name="line-155"></a>    <span class='varid'>compQName</span>   <span class='keyglyph'>=</span> <span class='varid'>compileComputedQName</span> <span class='varid'>node</span>
<a name="line-156"></a>    <span class='varid'>attribSets</span>  <span class='keyglyph'>=</span> <span class='conid'>UsedAttribSets</span> <span class='varop'>$</span> <span class='varid'>parseExNames</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span>
<a name="line-157"></a>                  <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltUseAttributeSets</span> <span class='str'>""</span>
<a name="line-158"></a>    <span class='varid'>template</span>    <span class='keyglyph'>=</span> <span class='varid'>compileTemplate</span> <span class='layout'>(</span><span class='varid'>getChildren</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-159"></a>
<a name="line-160"></a><a name="compileAttribute"></a><span class='definition'>compileAttribute</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-161"></a><span class='definition'>compileAttribute</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> 
<a name="line-162"></a>    <span class='conid'>TemplAttribute</span> <span class='layout'>(</span><span class='varid'>compileComputedQName</span> <span class='varid'>node</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>compileTemplate</span> <span class='layout'>(</span><span class='varid'>getChildren</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-163"></a>
<a name="line-164"></a><a name="compileText"></a><span class='comment'>-- compiles xsl:text</span>
<a name="line-165"></a><span class='definition'>compileText</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-166"></a><span class='definition'>compileText</span> <span class='keyglyph'>=</span> <span class='conid'>TemplText</span> <span class='varop'>.</span> <span class='varid'>collectTextnodes</span> <span class='varop'>.</span> <span class='varid'>getChildren</span>
<a name="line-167"></a>
<a name="line-168"></a><a name="compileTextnode"></a><span class='comment'>-- compiles textNode </span>
<a name="line-169"></a><span class='definition'>compileTextnode</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-170"></a><span class='definition'>compileTextnode</span> <span class='keyglyph'>=</span> <span class='conid'>TemplText</span> <span class='varop'>.</span> <span class='varid'>fromJust</span> <span class='varop'>.</span> <span class='varid'>getText</span>
<a name="line-171"></a>
<a name="line-172"></a><a name="compileValueOf"></a><span class='definition'>compileValueOf</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-173"></a><span class='definition'>compileValueOf</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> 
<a name="line-174"></a>    <span class='conid'>TemplValueOf</span> <span class='varop'>$</span> <span class='varid'>parseStringExpr</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltSelect</span>
<a name="line-175"></a>
<a name="line-176"></a><a name="compileComment"></a><span class='definition'>compileComment</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-177"></a><span class='definition'>compileComment</span> <span class='keyglyph'>=</span> <span class='conid'>TemplComment</span> <span class='varop'>.</span> <span class='varid'>compileTemplate</span> <span class='varop'>.</span> <span class='varid'>getChildren</span>
<a name="line-178"></a>
<a name="line-179"></a><a name="compileProcInstr"></a><span class='definition'>compileProcInstr</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-180"></a><span class='definition'>compileProcInstr</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> 
<a name="line-181"></a>   <span class='conid'>TemplProcInstr</span> <span class='varid'>name</span> <span class='varid'>content</span>
<a name="line-182"></a>  <span class='keyword'>where</span>
<a name="line-183"></a>    <span class='varid'>name</span>    <span class='keyglyph'>=</span> <span class='varid'>parseAVT</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span>  <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltName</span>
<a name="line-184"></a>    <span class='varid'>content</span> <span class='keyglyph'>=</span> <span class='varid'>compileTemplate</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-185"></a>
<a name="line-186"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-187"></a>
<a name="line-188"></a><a name="compileLiteralResultElement"></a><span class='definition'>compileLiteralResultElement</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-189"></a><span class='definition'>compileLiteralResultElement</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-190"></a>    <span class='conid'>TemplElement</span> <span class='varid'>compQName</span> <span class='varid'>nsUris</span> <span class='varid'>attribSets</span> <span class='varid'>content</span>
<a name="line-191"></a>  <span class='keyword'>where</span> 
<a name="line-192"></a>    <span class='varid'>nsUris</span>             <span class='keyglyph'>=</span> <span class='varid'>extractAddUris</span> <span class='varid'>node</span>
<a name="line-193"></a>    <span class='varid'>compQName</span>          <span class='keyglyph'>=</span> <span class='conid'>LiteralQName</span>   <span class='varop'>$</span> <span class='varid'>fromJust</span> <span class='varop'>$</span> <span class='varid'>getElemName</span> <span class='varid'>node</span>
<a name="line-194"></a>    <span class='varid'>attribSets</span>         <span class='keyglyph'>=</span> <span class='conid'>UsedAttribSets</span> <span class='varop'>$</span> <span class='varid'>parseExNames</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>attrSetsStr</span>
<a name="line-195"></a>    <span class='varid'>attrSetsStr</span>        <span class='keyglyph'>=</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltUseAttributeSetsLRE</span> <span class='str'>""</span>
<a name="line-196"></a>    <span class='varid'>content</span>            <span class='keyglyph'>=</span> <span class='conid'>TemplComposite</span> <span class='varop'>$</span> <span class='varid'>attributes</span> <span class='varop'>++</span> <span class='keyglyph'>[</span><span class='varid'>template</span><span class='keyglyph'>]</span>
<a name="line-197"></a>    <span class='varid'>attributes</span>         <span class='keyglyph'>=</span> <span class='varid'>mapMaybe</span> <span class='layout'>(</span><span class='varid'>compileLREAttribute</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>fromJust</span> <span class='varop'>$</span> <span class='varid'>getAttrl</span> <span class='varid'>node</span>
<a name="line-198"></a>    <span class='varid'>template</span>           <span class='keyglyph'>=</span> <span class='varid'>compileTemplate</span> <span class='layout'>(</span><span class='varid'>getChildren</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-199"></a>
<a name="line-200"></a><a name="compileLREAttribute"></a><span class='definition'>compileLREAttribute</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Maybe</span> <span class='conid'>Template</span>
<a name="line-201"></a><span class='definition'>compileLREAttribute</span> <span class='varid'>uris</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> 
<a name="line-202"></a>    <span class='keyword'>if</span> <span class='varid'>isSpecial</span> 
<a name="line-203"></a>      <span class='keyword'>then</span> <span class='conid'>Nothing</span>
<a name="line-204"></a>      <span class='keyword'>else</span> <span class='conid'>Just</span> <span class='varop'>$</span> <span class='conid'>TemplAttribute</span> <span class='layout'>(</span><span class='conid'>LiteralQName</span> <span class='varid'>name</span><span class='layout'>)</span> <span class='varid'>val</span>  
<a name="line-205"></a>  <span class='keyword'>where</span> 
<a name="line-206"></a>    <span class='varid'>isSpecial</span> <span class='keyglyph'>=</span> <span class='varid'>namespaceUri</span> <span class='varid'>name</span> <span class='varop'>`elem`</span> <span class='keyglyph'>[</span><span class='varid'>xsltUri</span><span class='layout'>,</span> <span class='varid'>xmlnsNamespace</span><span class='keyglyph'>]</span>
<a name="line-207"></a>    <span class='varid'>name</span>      <span class='keyglyph'>=</span> <span class='varid'>fromJust</span> <span class='varop'>$</span> <span class='varid'>getAttrName</span> <span class='varid'>node</span>
<a name="line-208"></a>    <span class='varid'>val</span>       <span class='keyglyph'>=</span> <span class='conid'>TemplValueOf</span> <span class='varop'>$</span> <span class='varid'>parseAVT</span> <span class='varid'>uris</span> <span class='varop'>$</span> <span class='varid'>collectTextnodes</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-209"></a>
<a name="line-210"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-211"></a>
<a name="line-212"></a><a name="compileApplyTempl"></a><span class='definition'>compileApplyTempl</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-213"></a><span class='definition'>compileApplyTempl</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-214"></a>    <span class='conid'>TemplApply</span> <span class='varid'>expr</span> <span class='varid'>mode</span> <span class='varid'>args</span> <span class='varid'>sorting</span>
<a name="line-215"></a>  <span class='keyword'>where</span>
<a name="line-216"></a>    <span class='varid'>expr</span>    <span class='keyglyph'>=</span> <span class='varid'>liftM</span> <span class='layout'>(</span><span class='varid'>parseSelect</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>tryFetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltSelect</span>
<a name="line-217"></a>    <span class='varid'>mode</span>    <span class='keyglyph'>=</span> <span class='varid'>liftM</span> <span class='layout'>(</span><span class='varid'>parseExName</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>tryFetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltMode</span>
<a name="line-218"></a>    <span class='varid'>args</span>    <span class='keyglyph'>=</span> <span class='varid'>compileVariables</span>          <span class='varop'>$</span> <span class='varid'>filter</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltWithParam</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>par</span>
<a name="line-219"></a>    <span class='varid'>sorting</span> <span class='keyglyph'>=</span>  <span class='varid'>map</span> <span class='varid'>compileSortKey</span> <span class='varid'>srt</span>
<a name="line-220"></a>    <span class='layout'>(</span><span class='varid'>srt</span><span class='layout'>,</span><span class='varid'>par</span><span class='layout'>)</span> <span class='keyglyph'>=</span>  <span class='varid'>partition</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltSort</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-221"></a>
<a name="line-222"></a><a name="compileApplyImports"></a><span class='definition'>compileApplyImports</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-223"></a><span class='definition'>compileApplyImports</span> <span class='sel'>_node</span>
<a name="line-224"></a>    <span class='keyglyph'>=</span> <span class='conid'>TemplApplyImports</span>
<a name="line-225"></a>
<a name="line-226"></a><a name="compileCallTempl"></a><span class='definition'>compileCallTempl</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-227"></a><span class='definition'>compileCallTempl</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-228"></a>    <span class='conid'>TemplCall</span> <span class='varid'>name</span> <span class='varid'>args</span>
<a name="line-229"></a>  <span class='keyword'>where</span>
<a name="line-230"></a>    <span class='varid'>name</span> <span class='keyglyph'>=</span> <span class='varid'>parseExName</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltName</span>
<a name="line-231"></a>    <span class='varid'>args</span> <span class='keyglyph'>=</span> <span class='varid'>compileVariables</span>  <span class='varop'>$</span> <span class='varid'>filter</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltWithParam</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-232"></a>
<a name="line-233"></a><a name="compileTemplVariable"></a><span class='definition'>compileTemplVariable</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-234"></a><span class='definition'>compileTemplVariable</span> <span class='keyglyph'>=</span> <span class='conid'>TemplVariable</span> <span class='varop'>.</span> <span class='varid'>compileVariable</span>
<a name="line-235"></a>
<a name="line-236"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-237"></a>
<a name="line-238"></a><a name="compileCopy"></a><span class='definition'>compileCopy</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-239"></a><span class='definition'>compileCopy</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-240"></a>    <span class='conid'>TemplCopy</span> <span class='varid'>attribSets</span> <span class='varop'>$</span> <span class='varid'>compileTemplate</span> <span class='layout'>(</span><span class='varid'>getChildren</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-241"></a>  <span class='keyword'>where</span>
<a name="line-242"></a>    <span class='varid'>attribSets</span>  <span class='keyglyph'>=</span> <span class='conid'>UsedAttribSets</span> <span class='varop'>$</span> <span class='varid'>parseExNames</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltUseAttributeSets</span> <span class='str'>""</span>
<a name="line-243"></a>
<a name="line-244"></a><a name="compileCopyOf"></a><span class='definition'>compileCopyOf</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-245"></a><span class='definition'>compileCopyOf</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> <span class='conid'>TemplCopyOf</span> <span class='varop'>$</span> <span class='varid'>parseExpr</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltSelect</span>
<a name="line-246"></a>
<a name="line-247"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-248"></a>
<a name="line-249"></a><a name="compileTemplate"></a><span class='definition'>compileTemplate</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span>
<a name="line-250"></a><span class='definition'>compileTemplate</span> <span class='keyglyph'>[</span><span class='varid'>node</span><span class='keyglyph'>]</span>       <span class='keyglyph'>=</span> 
<a name="line-251"></a>   <span class='keyword'>if</span> <span class='varid'>isElem</span> <span class='varid'>node</span>
<a name="line-252"></a>   <span class='keyword'>then</span> <span class='keyword'>let</span> <span class='varid'>elemName</span> <span class='keyglyph'>=</span> <span class='varid'>fromJust</span> <span class='varop'>$</span> <span class='varid'>getElemName</span> <span class='varid'>node</span> <span class='keyword'>in</span>        
<a name="line-253"></a>        <span class='keyword'>if</span>      <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltMessage</span>        <span class='keyword'>then</span> <span class='varid'>compileMessage</span>       <span class='varid'>node</span>
<a name="line-254"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltForEach</span>        <span class='keyword'>then</span> <span class='varid'>compileForEach</span>       <span class='varid'>node</span>
<a name="line-255"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltChoose</span>         <span class='keyword'>then</span> <span class='varid'>compileChoose</span>        <span class='varid'>node</span>   
<a name="line-256"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltIf</span>             <span class='keyword'>then</span> <span class='varid'>compileIf</span>            <span class='varid'>node</span>
<a name="line-257"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltElement</span>        <span class='keyword'>then</span> <span class='varid'>compileElement</span>       <span class='varid'>node</span>
<a name="line-258"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltAttribute</span>      <span class='keyword'>then</span> <span class='varid'>compileAttribute</span>     <span class='varid'>node</span>
<a name="line-259"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltText</span>           <span class='keyword'>then</span> <span class='varid'>compileText</span>          <span class='varid'>node</span>
<a name="line-260"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltValueOf</span>        <span class='keyword'>then</span> <span class='varid'>compileValueOf</span>       <span class='varid'>node</span>
<a name="line-261"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltComment</span>        <span class='keyword'>then</span> <span class='varid'>compileComment</span>       <span class='varid'>node</span>
<a name="line-262"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltProcInstr</span>      <span class='keyword'>then</span> <span class='varid'>compileProcInstr</span>     <span class='varid'>node</span>
<a name="line-263"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltApplyTemplates</span> <span class='keyword'>then</span> <span class='varid'>compileApplyTempl</span>    <span class='varid'>node</span>
<a name="line-264"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltApplyImports</span>   <span class='keyword'>then</span> <span class='varid'>compileApplyImports</span>  <span class='varid'>node</span>
<a name="line-265"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltCallTemplate</span>   <span class='keyword'>then</span> <span class='varid'>compileCallTempl</span>     <span class='varid'>node</span>
<a name="line-266"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltVariable</span>       <span class='keyword'>then</span> <span class='varid'>compileTemplVariable</span> <span class='varid'>node</span>
<a name="line-267"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltCopy</span>           <span class='keyword'>then</span> <span class='varid'>compileCopy</span>          <span class='varid'>node</span>
<a name="line-268"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>equivQName</span> <span class='varid'>elemName</span> <span class='varid'>xsltCopyOf</span>         <span class='keyword'>then</span> <span class='varid'>compileCopyOf</span>        <span class='varid'>node</span>
<a name="line-269"></a>
<a name="line-270"></a>        <span class='comment'>-- no other xslt elements allowed here:</span>
<a name="line-271"></a>        <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>namespaceUri</span> <span class='varid'>elemName</span> <span class='varop'>==</span> <span class='varid'>xsltUri</span>
<a name="line-272"></a>        <span class='keyword'>then</span> <span class='varid'>error</span> <span class='varop'>$</span> <span class='str'>"xslt-element "</span> <span class='varop'>++</span> <span class='varid'>localPart</span> <span class='varid'>elemName</span> <span class='varop'>++</span> <span class='str'>" not allowed within this context."</span>
<a name="line-273"></a>
<a name="line-274"></a>        <span class='comment'>-- for now all other elements will be considered as Literal Result Elements</span>
<a name="line-275"></a>        <span class='keyword'>else</span> <span class='varid'>compileLiteralResultElement</span> <span class='varid'>node</span>
<a name="line-276"></a>
<a name="line-277"></a>   <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>isText</span> <span class='varid'>node</span> <span class='keyword'>then</span> <span class='varid'>compileTextnode</span> <span class='varid'>node</span>
<a name="line-278"></a>
<a name="line-279"></a>   <span class='keyword'>else</span>
<a name="line-280"></a>       <span class='varid'>error</span> <span class='varop'>$</span> <span class='str'>"Unsupported node-type in xslt sheet: "</span> <span class='varop'>++</span> <span class='varid'>show</span> <span class='layout'>(</span><span class='varid'>getNode</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-281"></a><span class='definition'>compileTemplate</span> <span class='varid'>list</span> <span class='keyglyph'>=</span> <span class='varid'>compileComposite</span> <span class='varid'>list</span>
<a name="line-282"></a>
<a name="line-283"></a>
<a name="line-284"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-285"></a><span class='comment'>-- Assembling of the entire stylesheet</span>
<a name="line-286"></a>
<a name="line-287"></a><a name="assembleStylesheet"></a><span class='definition'>assembleStylesheet</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>CompiledStylesheet</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>CompiledStylesheet</span>
<a name="line-288"></a><span class='definition'>assembleStylesheet</span> <span class='varid'>xslNode</span> <span class='varid'>imports</span> <span class='keyglyph'>=</span>
<a name="line-289"></a>    <span class='conid'>CompStylesheet</span> <span class='varid'>matchRules</span> <span class='varid'>namedRules</span> <span class='varid'>variables</span> <span class='varid'>attsets</span> <span class='varid'>strips</span> <span class='varid'>aliases</span>
<a name="line-290"></a>  <span class='keyword'>where</span> 
<a name="line-291"></a>    <span class='comment'>-- entire contents:</span>
<a name="line-292"></a>    <span class='layout'>(</span><span class='varid'>namedRules</span><span class='layout'>,</span>    
<a name="line-293"></a>     <span class='varid'>matchRules</span><span class='layout'>)</span>          <span class='keyglyph'>=</span> <span class='varid'>assembleRules</span> <span class='varid'>ruleElems</span> <span class='varid'>importedMatchRules</span> <span class='varid'>importedNamedRules</span>
<a name="line-294"></a>    <span class='varid'>variables</span>             <span class='keyglyph'>=</span> <span class='varid'>assembleVariables</span> <span class='varid'>varElems</span> <span class='varid'>importedVariables</span>
<a name="line-295"></a>    <span class='varid'>attsets</span>               <span class='keyglyph'>=</span> <span class='varid'>assembleAttrSets</span> <span class='varid'>attsetElems</span> <span class='varid'>importedAttribSets</span>
<a name="line-296"></a>    <span class='varid'>strips</span>                <span class='keyglyph'>=</span> <span class='varid'>assembleStrips</span> <span class='varid'>stripElems</span> <span class='varid'>preserveElems</span> <span class='varid'>importedStrips</span>
<a name="line-297"></a>    <span class='varid'>aliases</span>               <span class='keyglyph'>=</span> <span class='varid'>assembleAliases</span> <span class='varid'>nsAliasElems</span> <span class='varid'>importedAliases</span>
<a name="line-298"></a>
<a name="line-299"></a>    <span class='comment'>-- element content:</span>
<a name="line-300"></a>    <span class='layout'>(</span><span class='varid'>nsAliasElems</span><span class='layout'>,</span> <span class='sel'>_r5</span><span class='layout'>)</span>   <span class='keyglyph'>=</span> <span class='varid'>partition</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltNamespaceAlias</span><span class='layout'>)</span> <span class='varid'>r4</span>
<a name="line-301"></a>    <span class='layout'>(</span><span class='varid'>ruleElems</span><span class='layout'>,</span> <span class='varid'>r4</span><span class='layout'>)</span>       <span class='keyglyph'>=</span> <span class='varid'>partition</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltTemplate</span><span class='layout'>)</span> <span class='varid'>r3</span>
<a name="line-302"></a>    <span class='layout'>(</span><span class='varid'>varElems</span><span class='layout'>,</span> <span class='varid'>r3</span><span class='layout'>)</span>        <span class='keyglyph'>=</span> <span class='varid'>partition</span> <span class='layout'>(</span><span class='keyglyph'>\</span><span class='varid'>node</span> <span class='keyglyph'>-&gt;</span> <span class='varid'>isElemType</span> <span class='varid'>xsltVariable</span> <span class='varid'>node</span> <span class='varop'>||</span> <span class='varid'>isElemType</span> <span class='varid'>xsltParam</span> <span class='varid'>node</span><span class='layout'>)</span> <span class='varid'>r2</span>
<a name="line-303"></a>    <span class='layout'>(</span><span class='varid'>attsetElems</span><span class='layout'>,</span> <span class='varid'>r2</span><span class='layout'>)</span>     <span class='keyglyph'>=</span> <span class='varid'>partition</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltAttributeSet</span><span class='layout'>)</span> <span class='varid'>r1</span>
<a name="line-304"></a>    <span class='layout'>(</span><span class='varid'>preserveElems</span><span class='layout'>,</span> <span class='varid'>r1</span><span class='layout'>)</span>   <span class='keyglyph'>=</span> <span class='varid'>partition</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltPreserveSpace</span><span class='layout'>)</span> <span class='varid'>r0</span>
<a name="line-305"></a>    <span class='layout'>(</span><span class='varid'>stripElems</span><span class='layout'>,</span> <span class='varid'>r0</span><span class='layout'>)</span>      <span class='keyglyph'>=</span> <span class='varid'>partition</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltStripSpace</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>xslNode</span>
<a name="line-306"></a>
<a name="line-307"></a>    <span class='comment'>-- imported stuff:</span>
<a name="line-308"></a>    <span class='varid'>importedAttribSets</span>    <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>getAttributeSets</span> <span class='varid'>imports</span>
<a name="line-309"></a>    <span class='varid'>importedVariables</span>     <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>getVariables</span> <span class='varid'>revImports</span>
<a name="line-310"></a>    <span class='varid'>importedNamedRules</span>    <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>getNamedRules</span> <span class='varid'>revImports</span>
<a name="line-311"></a>    <span class='varid'>importedMatchRules</span>    <span class='keyglyph'>=</span> <span class='varid'>concatMap</span> <span class='varid'>getMatchRules</span> <span class='varid'>revImports</span>
<a name="line-312"></a>    <span class='varid'>importedStrips</span>        <span class='keyglyph'>=</span> <span class='varid'>concatMap</span> <span class='varid'>getStrips</span> <span class='varid'>revImports</span>
<a name="line-313"></a>    <span class='varid'>importedAliases</span>       <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>getAliases</span> <span class='varid'>revImports</span>
<a name="line-314"></a>    <span class='varid'>revImports</span>            <span class='keyglyph'>=</span> <span class='varid'>reverse</span> <span class='varid'>imports</span>
<a name="line-315"></a>
<a name="line-316"></a><a name="assembleRules"></a><span class='definition'>assembleRules</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>MatchRule</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>Map</span> <span class='conid'>ExName</span> <span class='conid'>NamedRule</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='layout'>(</span><span class='conid'>Map</span> <span class='conid'>ExName</span> <span class='conid'>NamedRule</span><span class='layout'>,</span> <span class='keyglyph'>[</span><span class='conid'>MatchRule</span><span class='keyglyph'>]</span><span class='layout'>)</span>
<a name="line-317"></a><span class='definition'>assembleRules</span> <span class='varid'>nodes</span> <span class='varid'>importedMatches</span> <span class='varid'>importedProcs</span> <span class='keyglyph'>=</span>
<a name="line-318"></a>    <span class='layout'>(</span><span class='varid'>resProcs</span><span class='layout'>,</span> <span class='varid'>resMatches</span><span class='layout'>)</span>
<a name="line-319"></a>  <span class='keyword'>where</span>
<a name="line-320"></a>  
<a name="line-321"></a>  <span class='comment'>-- matches:  </span>
<a name="line-322"></a>    <span class='varid'>resMatches</span>       <span class='keyglyph'>=</span> <span class='varid'>localMatches</span> <span class='varop'>++</span> <span class='varid'>importedMatches</span>
<a name="line-323"></a>    <span class='varid'>localMatches</span>     <span class='keyglyph'>=</span> <span class='varid'>reverse</span> <span class='varop'>$</span> <span class='varid'>sortBy</span> <span class='varid'>cmp</span> <span class='varid'>matches</span>
<a name="line-324"></a>    <span class='varid'>cmp</span> <span class='varid'>rulA</span> <span class='varid'>rulB</span>    <span class='keyglyph'>=</span> <span class='varid'>compare</span> <span class='layout'>(</span><span class='varid'>getRulePrio</span> <span class='varid'>rulA</span><span class='layout'>)</span> <span class='layout'>(</span><span class='varid'>getRulePrio</span> <span class='varid'>rulB</span><span class='layout'>)</span>
<a name="line-325"></a>
<a name="line-326"></a>  <span class='comment'>-- procedures:</span>
<a name="line-327"></a>    <span class='varid'>resProcs</span>         <span class='keyglyph'>=</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>unions</span> <span class='layout'>(</span><span class='varid'>localProcs</span><span class='conop'>:</span><span class='varid'>importedProcs</span><span class='layout'>)</span>
<a name="line-328"></a>    <span class='varid'>localProcs</span>       <span class='keyglyph'>=</span> <span class='varid'>foldl</span> <span class='varid'>ins</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>empty</span> <span class='varid'>procs</span>
<a name="line-329"></a>    <span class='varid'>ins</span> <span class='varid'>map'</span> <span class='varid'>rule</span>    <span class='keyglyph'>=</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>insertWith</span> <span class='layout'>(</span><span class='varid'>error</span> <span class='varop'>$</span> <span class='str'>"named-rule "</span><span class='varop'>++</span> <span class='varid'>show</span> <span class='layout'>(</span><span class='varid'>getRuleName</span> <span class='varid'>rule</span><span class='layout'>)</span> <span class='varop'>++</span><span class='str'>" is already defined on this level"</span><span class='layout'>)</span>
<a name="line-330"></a>                                     <span class='layout'>(</span><span class='varid'>getRuleName</span> <span class='varid'>rule</span><span class='layout'>)</span> <span class='varid'>rule</span> <span class='varid'>map'</span>
<a name="line-331"></a>
<a name="line-332"></a>  <span class='comment'>-- compile all xsl:template's:</span>
<a name="line-333"></a>    <span class='layout'>(</span><span class='varid'>procs</span><span class='layout'>,</span> <span class='varid'>matches</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='varid'>catMaybes</span> <span class='varop'>***</span> <span class='varid'>concat</span> <span class='varop'>$</span> <span class='varid'>unzip</span> <span class='varop'>$</span> <span class='varid'>map</span> <span class='layout'>(</span><span class='varid'>compileRule</span> <span class='varid'>importedMatches</span><span class='layout'>)</span> <span class='varid'>nodes</span>
<a name="line-334"></a>
<a name="line-335"></a><a name="assembleVariables"></a><span class='definition'>assembleVariables</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='layout'>(</span><span class='conid'>Map</span> <span class='conid'>ExName</span> <span class='conid'>Variable</span><span class='layout'>)</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='layout'>(</span><span class='conid'>Map</span> <span class='conid'>ExName</span> <span class='conid'>Variable</span><span class='layout'>)</span>       
<a name="line-336"></a><span class='definition'>assembleVariables</span> <span class='varid'>varElems</span> <span class='keyglyph'>=</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>unions</span> <span class='varop'>.</span> <span class='layout'>(</span><span class='varid'>compileVariables</span> <span class='varid'>varElems</span><span class='conop'>:</span><span class='layout'>)</span>
<a name="line-337"></a>
<a name="line-338"></a><a name="assembleAttrSets"></a><span class='definition'>assembleAttrSets</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>Map</span> <span class='conid'>ExName</span> <span class='keyglyph'>[</span><span class='conid'>AttributeSet</span><span class='keyglyph'>]</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Map</span> <span class='conid'>ExName</span> <span class='keyglyph'>[</span><span class='conid'>AttributeSet</span><span class='keyglyph'>]</span>
<a name="line-339"></a><span class='definition'>assembleAttrSets</span> <span class='varid'>attsetElems</span> <span class='keyglyph'>=</span>
<a name="line-340"></a>    <span class='varid'>foldr</span> <span class='layout'>(</span><span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>unionWith</span> <span class='layout'>(</span><span class='varop'>++</span><span class='layout'>)</span><span class='layout'>)</span> <span class='varid'>localAttribSets</span>
<a name="line-341"></a>  <span class='keyword'>where</span>
<a name="line-342"></a>    <span class='varid'>localAttribSets</span>       <span class='keyglyph'>=</span> <span class='varid'>foldr</span> <span class='varid'>insertAs</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>empty</span>
<a name="line-343"></a>                            <span class='varop'>$</span> <span class='varid'>map</span> <span class='varid'>compileAttributeSet</span> <span class='varid'>attsetElems</span>
<a name="line-344"></a>    <span class='varid'>insertAs</span> <span class='keyword'>as</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>AttribSet</span> <span class='varid'>name</span> <span class='keyword'>_</span> <span class='keyword'>_</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>insertWith</span> <span class='layout'>(</span><span class='varop'>++</span><span class='layout'>)</span> <span class='varid'>name</span> <span class='keyglyph'>[</span><span class='keyword'>as</span><span class='keyglyph'>]</span>
<a name="line-345"></a>
<a name="line-346"></a><a name="assembleStrips"></a><span class='definition'>assembleStrips</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span><span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>Strips</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>Strips</span><span class='keyglyph'>]</span>
<a name="line-347"></a><span class='definition'>assembleStrips</span> <span class='varid'>stripElems</span> <span class='varid'>preserveElems</span> <span class='keyglyph'>=</span>
<a name="line-348"></a>    <span class='layout'>(</span><span class='varid'>localStrips</span> <span class='conop'>:</span><span class='layout'>)</span>
<a name="line-349"></a>  <span class='keyword'>where</span>
<a name="line-350"></a>    <span class='varid'>localStrips</span> <span class='keyglyph'>=</span> <span class='varid'>feedStrips</span> <span class='layout'>(</span><span class='varid'>concatMap</span> <span class='varid'>compileStrips</span> <span class='varid'>stripElems</span><span class='layout'>)</span>
<a name="line-351"></a>                  <span class='varop'>$</span> <span class='varid'>feedPreserves</span> <span class='layout'>(</span><span class='varid'>concatMap</span> <span class='varid'>compilePreserves</span> <span class='varid'>preserveElems</span><span class='layout'>)</span>
<a name="line-352"></a>                  <span class='varop'>$</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>empty</span>
<a name="line-353"></a>
<a name="line-354"></a><a name="assembleAliases"></a><span class='definition'>assembleAliases</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>NSAliasing</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>NSAliasing</span>
<a name="line-355"></a><span class='definition'>assembleAliases</span> <span class='varid'>nsAliasElems</span> <span class='keyglyph'>=</span>
<a name="line-356"></a>    <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>unions</span> <span class='varop'>.</span> <span class='layout'>(</span><span class='varid'>localAliases</span><span class='conop'>:</span><span class='layout'>)</span>
<a name="line-357"></a>  <span class='keyword'>where</span>
<a name="line-358"></a>    <span class='varid'>localAliases</span>          <span class='keyglyph'>=</span> <span class='varid'>foldr</span> <span class='varid'>addAlias'</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>empty</span> <span class='varid'>nsAliasElems</span>
<a name="line-359"></a>    <span class='varid'>addAlias'</span> <span class='varid'>node</span>        <span class='keyglyph'>=</span> <span class='varid'>uncurry</span> <span class='layout'>(</span><span class='varid'>addAlias</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>compileAlias</span> <span class='varid'>node</span>
<a name="line-360"></a>
<a name="line-361"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-362"></a>
<a name="line-363"></a><a name="compileRule"></a><span class='comment'>-- compile a rule from an xsl:template element.</span>
<a name="line-364"></a><span class='comment'>-- The resulting rule can either be a one or more match rule or a named rule, or both.</span>
<a name="line-365"></a><span class='comment'>-- The first argument is needed for xsl:apply-imports and contains</span>
<a name="line-366"></a><span class='comment'>-- a list of all subsequently imported rules</span>
<a name="line-367"></a><span class='definition'>compileRule</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>MatchRule</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='layout'>(</span><span class='conid'>Maybe</span> <span class='conid'>NamedRule</span><span class='layout'>,</span> <span class='keyglyph'>[</span><span class='conid'>MatchRule</span><span class='keyglyph'>]</span><span class='layout'>)</span>
<a name="line-368"></a><span class='definition'>compileRule</span> <span class='varid'>imports</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-369"></a>
<a name="line-370"></a>    <span class='keyword'>if</span> <span class='varid'>isNothing</span> <span class='varid'>match</span> <span class='varop'>&amp;&amp;</span> <span class='varid'>isNothing</span> <span class='varid'>name</span> 
<a name="line-371"></a>    <span class='keyword'>then</span> <span class='varid'>error</span> <span class='str'>"Error: Bogus rule (xsl:template) with neither match nor name attribute is illegal"</span>
<a name="line-372"></a>
<a name="line-373"></a>    <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>isJust</span> <span class='varid'>mode</span> <span class='varop'>&amp;&amp;</span> <span class='varid'>isNothing</span> <span class='varid'>match</span> 
<a name="line-374"></a>    <span class='keyword'>then</span> <span class='varid'>error</span> <span class='str'>"Error: Bogus mode attribute on none-match rule is illegal"</span>
<a name="line-375"></a>
<a name="line-376"></a>    <span class='keyword'>else</span> <span class='keyword'>if</span> <span class='varid'>isJust</span> <span class='varid'>priority</span> <span class='varop'>&amp;&amp;</span> <span class='varid'>isNothing</span> <span class='varid'>match</span> 
<a name="line-377"></a>    <span class='keyword'>then</span> <span class='varid'>error</span> <span class='str'>"Error: Bogus priority attribute on none-match rule is illegal"</span>
<a name="line-378"></a>
<a name="line-379"></a>    <span class='keyword'>else</span> 
<a name="line-380"></a>      <span class='layout'>(</span>
<a name="line-381"></a>        <span class='varid'>liftM</span> <span class='layout'>(</span><span class='keyglyph'>\</span><span class='varid'>n</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>NamRule</span> <span class='varid'>n</span> <span class='varid'>params</span> <span class='varid'>template</span><span class='layout'>)</span> <span class='varid'>name</span>
<a name="line-382"></a>      <span class='layout'>,</span> <span class='varid'>concat</span> <span class='varop'>$</span> <span class='varid'>maybeToList</span> <span class='varop'>$</span> <span class='varid'>liftM</span> <span class='layout'>(</span><span class='varid'>assembleMatchRule</span> <span class='varid'>priority</span> <span class='varid'>mode</span> <span class='varid'>imports</span> <span class='varid'>params</span> <span class='varid'>template</span><span class='layout'>)</span> <span class='varid'>match</span>
<a name="line-383"></a>      <span class='layout'>)</span> 
<a name="line-384"></a>
<a name="line-385"></a>  <span class='keyword'>where</span>
<a name="line-386"></a>    <span class='varid'>match</span>      <span class='keyglyph'>=</span> <span class='varid'>liftM</span> <span class='layout'>(</span><span class='varid'>parseMatch</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span><span class='layout'>)</span>  <span class='varop'>$</span> <span class='varid'>tryFetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltMatch</span>
<a name="line-387"></a>    <span class='varid'>name</span>       <span class='keyglyph'>=</span> <span class='varid'>liftM</span> <span class='layout'>(</span><span class='varid'>parseExName</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>tryFetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltName</span>
<a name="line-388"></a>    <span class='varid'>priority</span>   <span class='keyglyph'>=</span> <span class='varid'>liftM</span> <span class='varid'>read</span>                <span class='varop'>$</span> <span class='varid'>tryFetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltPriority</span>
<a name="line-389"></a>    <span class='varid'>mode</span>       <span class='keyglyph'>=</span> <span class='varid'>liftM</span> <span class='layout'>(</span><span class='varid'>parseExName</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>tryFetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltMode</span>
<a name="line-390"></a>    <span class='varid'>template</span>   <span class='keyglyph'>=</span> <span class='varid'>compileTemplate</span> <span class='varid'>content</span>
<a name="line-391"></a>    <span class='varid'>params</span>     <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>compileVariable</span> <span class='varid'>paramsXml</span>
<a name="line-392"></a>    <span class='layout'>(</span><span class='varid'>paramsXml</span><span class='layout'>,</span> <span class='varid'>content</span><span class='layout'>)</span> <span class='keyglyph'>=</span>
<a name="line-393"></a>                  <span class='varid'>partition</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltParam</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-394"></a>
<a name="line-395"></a><a name="assembleMatchRule"></a><span class='definition'>assembleMatchRule</span> <span class='keyglyph'>::</span> <span class='conid'>Maybe</span> <span class='conid'>Float</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Maybe</span> <span class='conid'>ExName</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>MatchRule</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>Variable</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Template</span> <span class='keyglyph'>-&gt;</span>  <span class='conid'>MatchExpr</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>MatchRule</span><span class='keyglyph'>]</span>
<a name="line-396"></a><span class='definition'>assembleMatchRule</span> <span class='varid'>pri</span> <span class='varid'>m</span> <span class='varid'>imp</span> <span class='varid'>par</span> <span class='varid'>tmpl</span> <span class='varid'>mtch</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='conid'>MatchExpr</span> <span class='varid'>expr</span><span class='layout'>)</span> <span class='keyglyph'>=</span>
<a name="line-397"></a>    <span class='keyword'>if</span> <span class='varid'>isJust</span> <span class='varid'>pri</span>
<a name="line-398"></a>    <span class='keyword'>then</span> <span class='varid'>return</span> <span class='varop'>$</span> <span class='conid'>MatRule</span> <span class='varid'>mtch</span> <span class='layout'>(</span><span class='varid'>fromJust</span> <span class='varid'>pri</span><span class='layout'>)</span> <span class='varid'>m</span> <span class='varid'>imp</span> <span class='varid'>par</span> <span class='varid'>tmpl</span>
<a name="line-399"></a>    <span class='keyword'>else</span> <span class='varid'>map</span> <span class='varid'>expand</span> <span class='varop'>$</span> <span class='varid'>splitMatchByPrio</span> <span class='varid'>expr</span>
<a name="line-400"></a>  <span class='keyword'>where</span> 
<a name="line-401"></a>    <span class='varid'>expand</span> <span class='layout'>(</span><span class='varid'>pri'</span><span class='layout'>,</span> <span class='varid'>mtch'</span><span class='layout'>)</span> <span class='keyglyph'>=</span> <span class='conid'>MatRule</span> <span class='layout'>(</span><span class='conid'>MatchExpr</span> <span class='varid'>mtch'</span><span class='layout'>)</span> <span class='varid'>pri'</span> <span class='varid'>m</span> <span class='varid'>imp</span> <span class='varid'>par</span> <span class='varid'>tmpl</span>
<a name="line-402"></a>
<a name="line-403"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-404"></a>
<a name="line-405"></a><a name="compileVariables"></a><span class='definition'>compileVariables</span> <span class='keyglyph'>::</span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Map</span> <span class='conid'>ExName</span> <span class='conid'>Variable</span>
<a name="line-406"></a><span class='definition'>compileVariables</span> <span class='varid'>nodes</span> <span class='keyglyph'>=</span>
<a name="line-407"></a>    <span class='varid'>foldl</span> <span class='varid'>insertVar</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>empty</span> <span class='varop'>$</span> <span class='varid'>varList</span>
<a name="line-408"></a>  <span class='keyword'>where</span>
<a name="line-409"></a>    <span class='varid'>varList</span>               <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='varid'>compileVariable</span> <span class='varop'>$</span> <span class='varid'>nodes</span>
<a name="line-410"></a>    <span class='varid'>insertVar</span> <span class='varid'>map'</span> <span class='varid'>var</span>    <span class='keyglyph'>=</span> <span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>insertWith</span> <span class='layout'>(</span><span class='varid'>error</span> <span class='varop'>$</span> <span class='str'>"parameter or variable "</span><span class='varop'>++</span> <span class='varid'>show</span> <span class='layout'>(</span><span class='varid'>getVarName</span> <span class='varid'>var</span><span class='layout'>)</span> <span class='varop'>++</span><span class='str'>" is already defined on this level"</span><span class='layout'>)</span>
<a name="line-411"></a>                                           <span class='layout'>(</span><span class='varid'>getVarName</span> <span class='varid'>var</span><span class='layout'>)</span> <span class='varid'>var</span> <span class='varid'>map'</span>
<a name="line-412"></a>
<a name="line-413"></a><a name="compileVariable"></a><span class='definition'>compileVariable</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>Variable</span>
<a name="line-414"></a><span class='definition'>compileVariable</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-415"></a>    <span class='conid'>MkVar</span> <span class='varid'>modus</span> <span class='varid'>name</span> <span class='varid'>exprOrRtf</span>
<a name="line-416"></a>  <span class='keyword'>where</span> 
<a name="line-417"></a>    <span class='varid'>modus</span>     <span class='keyglyph'>=</span> <span class='varid'>isElemType</span> <span class='varid'>xsltParam</span> <span class='varid'>node</span>
<a name="line-418"></a>    <span class='varid'>name</span>      <span class='keyglyph'>=</span> <span class='varid'>parseExName</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltName</span>
<a name="line-419"></a>    <span class='varid'>exprOrRtf</span> <span class='keyglyph'>=</span> <span class='keyword'>if</span> <span class='varid'>hasAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltSelect</span> <span class='varop'>||</span> <span class='varid'>null</span> <span class='layout'>(</span><span class='varid'>getChildren</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-420"></a>                <span class='keyword'>then</span> <span class='conid'>Left</span> <span class='varop'>$</span> <span class='varid'>parseExpr</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltSelect</span> <span class='str'>"''"</span>
<a name="line-421"></a>                <span class='keyword'>else</span> <span class='conid'>Right</span> <span class='varop'>$</span> <span class='varid'>compileTemplate</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-422"></a>
<a name="line-423"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-424"></a>
<a name="line-425"></a><a name="compileAttributeSet"></a><span class='definition'>compileAttributeSet</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>AttributeSet</span>
<a name="line-426"></a><span class='definition'>compileAttributeSet</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-427"></a>    <span class='conid'>AttribSet</span> <span class='varid'>name</span> <span class='varid'>usedsets</span> <span class='varid'>template</span>
<a name="line-428"></a>  <span class='keyword'>where</span>
<a name="line-429"></a>    <span class='varid'>name</span>     <span class='keyglyph'>=</span> <span class='varid'>parseExName</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltName</span>
<a name="line-430"></a>    <span class='varid'>usedsets</span> <span class='keyglyph'>=</span> <span class='conid'>UsedAttribSets</span>    <span class='varop'>$</span> <span class='varid'>parseExNames</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltUseAttributeSets</span> <span class='str'>""</span>
<a name="line-431"></a>    <span class='varid'>template</span> <span class='keyglyph'>=</span> <span class='varid'>compileTemplate</span>   <span class='varop'>$</span> <span class='varid'>filter</span> <span class='layout'>(</span><span class='varid'>isElemType</span> <span class='varid'>xsltAttribute</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>getChildren</span> <span class='varid'>node</span>
<a name="line-432"></a>
<a name="line-433"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-434"></a>
<a name="line-435"></a><a name="compileSortKey"></a><span class='definition'>compileSortKey</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>SortKey</span>
<a name="line-436"></a><span class='definition'>compileSortKey</span> <span class='varid'>node</span> <span class='keyglyph'>=</span>
<a name="line-437"></a>    <span class='conid'>SortK</span> <span class='varid'>expr</span> <span class='varid'>dataType</span> <span class='varid'>order</span>
<a name="line-438"></a>  <span class='keyword'>where</span>
<a name="line-439"></a>    <span class='varid'>expr</span>     <span class='keyglyph'>=</span> <span class='varid'>parseStringExpr</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltSelect</span> <span class='str'>"."</span>
<a name="line-440"></a>    <span class='varid'>dataType</span> <span class='keyglyph'>=</span> <span class='varid'>parseAVT</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span>        <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltDataType</span> <span class='str'>"text"</span>
<a name="line-441"></a>    <span class='varid'>order</span>    <span class='keyglyph'>=</span> <span class='varid'>parseAVT</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span>        <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltOrder</span> <span class='str'>"ascending"</span>
<a name="line-442"></a>
<a name="line-443"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-444"></a>
<a name="line-445"></a><a name="parseNTests"></a><span class='definition'>parseNTests</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>NTest</span><span class='keyglyph'>]</span>
<a name="line-446"></a><span class='definition'>parseNTests</span> <span class='varid'>uris</span> <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='layout'>(</span><span class='varid'>parseNTest</span> <span class='varid'>uris</span><span class='layout'>)</span> <span class='varop'>.</span> <span class='varid'>words</span>
<a name="line-447"></a>
<a name="line-448"></a><a name="compileStrips"></a><span class='definition'>compileStrips</span><span class='layout'>,</span><span class='varid'>compilePreserves</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>NTest</span><span class='keyglyph'>]</span>
<a name="line-449"></a><span class='definition'>compileStrips</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> <span class='varid'>parseNTests</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltElements</span>
<a name="line-450"></a><a name="compilePreserves"></a><span class='definition'>compilePreserves</span> <span class='keyglyph'>=</span> <span class='varid'>compileStrips</span>
<a name="line-451"></a>
<a name="line-452"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-453"></a>
<a name="line-454"></a><a name="compileAlias"></a><span class='definition'>compileAlias</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='layout'>(</span><span class='conid'>String</span><span class='layout'>,</span> <span class='conid'>String</span><span class='layout'>)</span>
<a name="line-455"></a><span class='definition'>compileAlias</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> 
<a name="line-456"></a>  <span class='layout'>(</span><span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltStylesheetPrefix</span><span class='layout'>,</span> <span class='varid'>fetchAttribute</span> <span class='varid'>node</span> <span class='varid'>xsltResultPrefix</span><span class='layout'>)</span>
<a name="line-457"></a>
<a name="line-458"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-459"></a><span class='comment'>-- Document level preprocessing</span>
<a name="line-460"></a>
<a name="line-461"></a><a name="prepareXSLTDocument"></a><span class='definition'>prepareXSLTDocument</span>	<span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>XmlTree</span>
<a name="line-462"></a><span class='definition'>prepareXSLTDocument</span>	<span class='keyglyph'>=</span> <span class='varid'>expandExEx</span> <span class='varop'>.</span> <span class='varid'>expandNSDecls</span> <span class='varop'>.</span> <span class='varid'>stripStylesheet</span> <span class='varop'>.</span> <span class='varid'>removePiCmt</span>
<a name="line-463"></a>
<a name="line-464"></a><a name="removePiCmt"></a><span class='definition'>removePiCmt</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>XmlTree</span>
<a name="line-465"></a><span class='definition'>removePiCmt</span> <span class='keyglyph'>=</span> <span class='varid'>fromJustErr</span> <span class='str'>"XSLT: No root element"</span> <span class='varop'>.</span> <span class='varid'>filterTree</span> <span class='layout'>(</span><span class='keyglyph'>\</span><span class='varid'>n</span> <span class='keyglyph'>-&gt;</span> <span class='varid'>not</span> <span class='layout'>(</span><span class='varid'>isPi</span> <span class='varid'>n</span><span class='layout'>)</span> <span class='varop'>&amp;&amp;</span> <span class='varid'>not</span> <span class='layout'>(</span><span class='varid'>isCmt</span> <span class='varid'>n</span><span class='layout'>)</span><span class='layout'>)</span>
<a name="line-466"></a>
<a name="line-467"></a><span class='comment'>-- Expand exclude-result-prefixes AND extension-element-prefixes</span>
<a name="line-468"></a>
<a name="line-469"></a><a name="expandExEx"></a><span class='definition'>expandExEx</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>XmlTree</span>
<a name="line-470"></a><span class='definition'>expandExEx</span> <span class='keyglyph'>=</span> <span class='varid'>mapTreeCtx</span> <span class='varid'>expandExExElem</span> <span class='layout'>(</span><span class='keyglyph'>[</span><span class='varid'>xsltUri</span><span class='layout'>,</span><span class='varid'>xmlNamespace</span><span class='layout'>,</span><span class='varid'>xmlnsNamespace</span><span class='keyglyph'>]</span><span class='layout'>,</span><span class='conid'>[]</span><span class='layout'>)</span>
<a name="line-471"></a>
<a name="line-472"></a><a name="expandExExElem"></a><span class='definition'>expandExExElem</span> <span class='keyglyph'>::</span> <span class='layout'>(</span><span class='keyglyph'>[</span><span class='conid'>String</span><span class='keyglyph'>]</span><span class='layout'>,</span> <span class='keyglyph'>[</span><span class='conid'>String</span><span class='keyglyph'>]</span><span class='layout'>)</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>XNode</span> <span class='keyglyph'>-&gt;</span> <span class='layout'>(</span><span class='layout'>(</span><span class='keyglyph'>[</span><span class='conid'>String</span><span class='keyglyph'>]</span><span class='layout'>,</span> <span class='keyglyph'>[</span><span class='conid'>String</span><span class='keyglyph'>]</span><span class='layout'>)</span><span class='layout'>,</span> <span class='conid'>XNode</span><span class='layout'>)</span>
<a name="line-473"></a><span class='definition'>expandExExElem</span> <span class='varid'>c</span><span class='keyglyph'>@</span><span class='layout'>(</span><span class='varid'>excl</span><span class='layout'>,</span> <span class='varid'>ext</span><span class='layout'>)</span> <span class='varid'>node</span>
<a name="line-474"></a>  <span class='keyglyph'>|</span> <span class='varid'>isElem</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> <span class='layout'>(</span><span class='layout'>(</span><span class='varid'>exclAcc</span><span class='layout'>,</span> <span class='varid'>extAcc</span><span class='layout'>)</span><span class='layout'>,</span> <span class='varid'>nodeNew</span><span class='layout'>)</span>
<a name="line-475"></a>  <span class='keyglyph'>|</span> <span class='varid'>otherwise</span>   <span class='keyglyph'>=</span> <span class='layout'>(</span><span class='varid'>c</span><span class='layout'>,</span> <span class='varid'>node</span><span class='layout'>)</span>
<a name="line-476"></a>  <span class='keyword'>where</span>
<a name="line-477"></a>    <span class='varid'>nodeNew</span>    <span class='keyglyph'>=</span> <span class='varid'>setAttribute</span> <span class='varid'>nameExcl</span> <span class='layout'>(</span><span class='varid'>unwords</span> <span class='varid'>exclAcc</span><span class='layout'>)</span> <span class='varop'>$</span> <span class='varid'>setAttribute</span> <span class='varid'>nameExt</span> <span class='layout'>(</span><span class='varid'>unwords</span> <span class='varid'>extAcc</span><span class='layout'>)</span> <span class='varid'>node</span>
<a name="line-478"></a>    <span class='varid'>exclAcc</span>    <span class='keyglyph'>=</span> <span class='varid'>exclNew</span> <span class='varop'>++</span> <span class='varid'>excl</span>
<a name="line-479"></a>    <span class='varid'>extAcc</span>     <span class='keyglyph'>=</span> <span class='varid'>extNew</span>  <span class='varop'>++</span> <span class='varid'>ext</span>
<a name="line-480"></a>    <span class='varid'>exclNew</span>    <span class='keyglyph'>=</span> <span class='varid'>extNew</span>  <span class='varop'>++</span> <span class='layout'>(</span><span class='varid'>parsePreList</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>nameExcl</span> <span class='str'>""</span><span class='layout'>)</span>
<a name="line-481"></a>    <span class='varid'>extNew</span>     <span class='keyglyph'>=</span>             <span class='varid'>parsePreList</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span> <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>nameExt</span>  <span class='str'>""</span>
<a name="line-482"></a>    <span class='layout'>(</span><span class='varid'>nameExcl</span><span class='layout'>,</span>
<a name="line-483"></a>     <span class='varid'>nameExt</span><span class='layout'>)</span>  <span class='keyglyph'>=</span> <span class='keyword'>if</span> <span class='layout'>(</span><span class='varid'>namespaceUri</span> <span class='varop'>$</span> <span class='varid'>fromJust</span> <span class='varop'>$</span> <span class='varid'>getElemName</span> <span class='varid'>node</span><span class='layout'>)</span> <span class='varop'>==</span> <span class='varid'>xsltUri</span>
<a name="line-484"></a>                   <span class='keyword'>then</span> <span class='layout'>(</span><span class='varid'>xsltExlcudeResultPrefixes</span>   <span class='layout'>,</span> <span class='varid'>xsltExtensionElementPrefixes</span>   <span class='layout'>)</span>
<a name="line-485"></a>                   <span class='keyword'>else</span> <span class='layout'>(</span><span class='varid'>xsltExlcudeResultPrefixesLRE</span><span class='layout'>,</span> <span class='varid'>xsltExtensionElementPrefixesLRE</span><span class='layout'>)</span>
<a name="line-486"></a>
<a name="line-487"></a><span class='comment'>-- parse a prefix list, create a list of uris: </span>
<a name="line-488"></a><span class='comment'>-- "pre1 pre2 pre3" -&gt; ["pre1.uri","pre2.uri","pre3.uri"]</span>
<a name="line-489"></a>
<a name="line-490"></a><a name="parsePreList"></a><span class='definition'>parsePreList</span> <span class='keyglyph'>::</span> <span class='conid'>UriMapping</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>String</span> <span class='keyglyph'>-&gt;</span> <span class='keyglyph'>[</span><span class='conid'>String</span><span class='keyglyph'>]</span>
<a name="line-491"></a><span class='definition'>parsePreList</span> <span class='varid'>uris</span> <span class='keyglyph'>=</span> <span class='varid'>map</span> <span class='layout'>(</span><span class='varid'>lookupPrefix</span> <span class='varid'>uris</span><span class='layout'>)</span> <span class='varop'>.</span> <span class='varid'>words</span>
<a name="line-492"></a>
<a name="line-493"></a><span class='comment'>-- -----------------------------------</span>
<a name="line-494"></a><span class='comment'>-- Extraction of contextual Information from an XML-Node</span>
<a name="line-495"></a>
<a name="line-496"></a><a name="extractAddUris"></a><span class='definition'>extractAddUris</span> <span class='keyglyph'>::</span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-&gt;</span> <span class='conid'>UriMapping</span>
<a name="line-497"></a><span class='definition'>extractAddUris</span> <span class='varid'>node</span> <span class='keyglyph'>=</span> 
<a name="line-498"></a>    <span class='layout'>(</span><span class='conid'>Map</span><span class='varop'>.</span><span class='varid'>filter</span> <span class='layout'>(</span><span class='varop'>`notElem`</span> <span class='varid'>exclUris</span><span class='layout'>)</span><span class='layout'>)</span><span class='varop'>&gt;&lt;</span><span class='varid'>node</span>
<a name="line-499"></a>  <span class='keyword'>where</span>
<a name="line-500"></a>    <span class='varid'>exclUris</span> <span class='keyglyph'>=</span> <span class='varid'>words</span> <span class='varop'>$</span> <span class='varid'>fetchAttributeWDefault</span> <span class='varid'>node</span> <span class='varid'>xsltExlcudeResultPrefixesLRE</span> <span class='str'>""</span>
<a name="line-501"></a>
<a name="line-502"></a><span class='comment'>-- -----------------------------------</span>
</pre></body>
</html>