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 -> XmlTree</span>
<a name="line-21"></a> <span class='layout'>,</span> <span class='varid'>assembleStylesheet</span> <span class='comment'>-- :: XmlTree -> [CompiledStylesheet] -> 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'>><</span>
<a name="line-42"></a>
<a name="line-43"></a><a name="><"></a><span class='layout'>(</span><span class='varop'>><</span><span class='layout'>)</span> <span class='keyglyph'>::</span> <span class='conid'>XmlNode</span> <span class='varid'>n</span> <span class='keyglyph'>=></span> <span class='layout'>(</span><span class='conid'>UriMapping</span> <span class='keyglyph'>-></span> <span class='varid'>a</span> <span class='layout'>)</span> <span class='keyglyph'>-></span> <span class='varid'>n</span> <span class='keyglyph'>-></span> <span class='varid'>a</span>
<a name="line-44"></a><a name="f"></a><span class='definition'>f</span> <span class='varop'>><</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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>&&</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'>-></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'>-></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'>><</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'>><</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'>><</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'>-></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'>-></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'>-></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'>><</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'>-></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'>-></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'>><</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'>-></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'>-></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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></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'>><</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'>-></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'>-></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'>-></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'>-></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'>><</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'>-></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'>-></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'>><</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'>-></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'>><</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'>><</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'>-></span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-></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'>-></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'>><</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'>><</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'>-></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'>-></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'>><</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'>-></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'>-></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'>><</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'>-></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'>><</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'>-></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'>-></span> <span class='keyglyph'>[</span><span class='conid'>CompiledStylesheet</span><span class='keyglyph'>]</span> <span class='keyglyph'>-></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'>-></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'>-></span> <span class='keyglyph'>[</span><span class='conid'>MatchRule</span><span class='keyglyph'>]</span> <span class='keyglyph'>-></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'>-></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'>-></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'>-></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'>-></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'>-></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'>-></span> <span class='keyglyph'>[</span><span class='conid'>XmlTree</span><span class='keyglyph'>]</span><span class='keyglyph'>-></span> <span class='keyglyph'>[</span><span class='conid'>Strips</span><span class='keyglyph'>]</span> <span class='keyglyph'>-></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'>-></span> <span class='keyglyph'>[</span><span class='conid'>NSAliasing</span><span class='keyglyph'>]</span> <span class='keyglyph'>-></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'>><</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'>-></span> <span class='conid'>XmlTree</span> <span class='keyglyph'>-></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'>&&</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'>&&</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'>&&</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'>-></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'>><</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'>><</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'>><</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'>-></span> <span class='conid'>Maybe</span> <span class='conid'>ExName</span> <span class='keyglyph'>-></span> <span class='keyglyph'>[</span><span class='conid'>MatchRule</span><span class='keyglyph'>]</span> <span class='keyglyph'>-></span> <span class='keyglyph'>[</span><span class='conid'>Variable</span><span class='keyglyph'>]</span> <span class='keyglyph'>-></span> <span class='conid'>Template</span> <span class='keyglyph'>-></span> <span class='conid'>MatchExpr</span> <span class='keyglyph'>-></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'>-></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'>-></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'>><</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'>><</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'>-></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'>><</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'>><</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'>-></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'>><</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'>><</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'>><</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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></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'>><</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'>-></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'>-></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'>-></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'>-></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'>&&</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'>-></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'>-></span> <span class='conid'>XNode</span> <span class='keyglyph'>-></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'>><</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'>><</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" -> ["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'>-></span> <span class='conid'>String</span> <span class='keyglyph'>-></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'>-></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'>><</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>