packages feed

hxt-relaxng (empty) → 9.0.0

raw patch · 38 files changed

+14598/−0 lines, 38 filesdep +basedep +containersdep +directorysetup-changed

Dependencies added: base, containers, directory, haskell98, hxt, hxt-charproperties, hxt-regex-xmlschema, network, parsec

Files

+ LICENSE view
@@ -0,0 +1,9 @@+The MIT License++Copyright (c) 2005 Uwe Schmidt, Martin Schmidt, Torben Kuseler++Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:++The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ Setup.hs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+import Distribution.Simple+main = defaultMain
+ examples/hparser/HXmlParser.hs view
@@ -0,0 +1,175 @@+-- ------------------------------------------------------------++{- |+   Module     : HXmlParser+   Copyright  : Copyright (C) 2005-2010 Uwe Schmidt+   License    : MIT++   Maintainer : Uwe Schmidt+   Maintainer : uwe@fh-wedel.de+   Stability  : experimental+   Portability: portable++   HXmlParser - Minimal Validating XML Parser of the Haskell XML Toolbox, no HTTP supported++   XML well-formed checker and validator.++   this program may be used as example main program for the+   arrow API of the Haskell XML Toolbox++   commandline parameter evaluation and+   and return code is the most complicated part+   of this example application++-}++-- ------------------------------------------------------------++module Main+where++import Text.XML.HXT.Core                -- import all stuff for parsing, validating, and transforming XML+import Text.XML.HXT.Curl		-- import HTTP access+import Text.XML.HXT.RelaxNG             -- import RelaxNG validation++import System.IO                        -- import the IO and commandline option stuff+import System.Environment+import System.Console.GetOpt+import System.Exit++-- ------------------------------------------------------------++-- |+-- the main program of the Haskell XML Validating Parser++main :: IO ()+main+    = do+      argv <- getArgs                                   -- get the commandline arguments+      (al, src) <- cmdlineOpts argv                     -- and evaluate them, return a key-value list+      [rc]  <- runX (parser al src)                     -- run the parser arrow+      exitProg (rc >= c_err)                            -- set return code and terminate++-- ------------------------------------------------------------++exitProg        :: Bool -> IO a+exitProg True   = exitWith (ExitFailure (-1))+exitProg False  = exitWith ExitSuccess++-- ------------------------------------------------------------++-- |+-- the /real/ main program+--+-- get wellformed document, validates document, propagates and check namespaces+-- and controls output++parser  :: SysConfigList -> String -> IOSArrow b Int+parser config src+    = configSysVars config                            -- set all global config options, the output file and the+      >>>                                               -- other user options are stored as key-value pairs in the stystem state+      readDocument [ withCurl []+		   ] src                                -- no more special read options needed+      >>>+      ( ( traceMsg 1 "start processing document"+          >>>+          ( processDocument $< getSysAttr "action" )    -- ask for the action stored in the key-value list of user defined values +          >>>+          traceMsg 1 "document processing finished"+        )+        `when`+        documentStatusOk+      )+      >>>+      traceSource+      >>>+      traceTree+      >>>+      ( (writeDocument [] $< getSysAttr "output-file")  -- ask for the output file stored in the system configuration+        `whenNot`+        ( getSysAttr "no-output" >>> isA (== "1") )     -- ask for the no-output attr value in the system key-value list+      )+      >>>+      getErrStatus++-- simple example of a processing arrow, selected by a command line option++processDocument :: String -> IOSArrow XmlTree XmlTree+processDocument "only-text"+    = traceMsg 1 "selecting plain text"+      >>>+      processChildren (deep isText)++processDocument "indent"+    = traceMsg 1 "indent document"+      >>>+      indentDoc++processDocument _action+    = traceMsg 1 "default action: do nothing"+      >>>+      this++-- ------------------------------------------------------------+--+-- the options definition part+-- see doc for System.Console.GetOpt++progName        :: String+progName        = "HXmlParser"+    +options         :: [OptDescr SysConfig]+options+    = generalOptions+      +++      inputOptions+      +++      relaxOptions+      +++      outputOptions+      +++      showOptions+      +++      [ Option "f"      ["output-file"] (ReqArg  (withSysAttr "output-file") "FILE") "output file for resulting document (default: stdout)"+      , Option "q"      ["no-output"]   (NoArg $  withSysAttr "no-output"      "1")   "no output of resulting document"+      , Option "x"      ["action"]      (ReqArg  (withSysAttr "action")   "ACTION")   "actions are: only-text, indent, no-op"+      ]+      -- the last 2 option values will be stored by withAttr in the system key-value list+      -- and can be read by getSysAttr key++usage           :: [String] -> IO a+usage errl+    | null errl+        = do+          hPutStrLn stdout use+          exitProg False+    | otherwise+        = do+          hPutStrLn stderr (concat errl ++ "\n" ++ use)+          exitProg True+    where+    header = "HXmlParser - Validating XML Parser of the Haskell XML Toolbox with Arrow Interface\n" +++             "XML well-formed checker, DTD validator, RelaxNG validator, HTML parser.\n\n" +++             "Usage: " ++ progName ++ " [OPTION...] [URI or FILE]"+    use    = usageInfo header options++cmdlineOpts     :: [String] -> IO (SysConfigList, String)+cmdlineOpts argv+    = case (getOpt Permute options argv) of+      (scfg,n,[])+          -> do+             sa <- src n+             help (getConfigAttr a_help scfg) sa+             return (scfg, sa)+      (_,_,errs)+          -> usage errs+    where+    src []      = return []+    src [uri]   = return uri+    src _       = usage ["only one input uri or file allowed\n"]++    help "1" _  = usage []+    help _ []   = usage ["no input uri or file given\n"]+    help _ _    = return ()++-- ------------------------------------------------------------
+ examples/hparser/Makefile view
@@ -0,0 +1,123 @@+# $Id: Makefile,v 1.9 2006/11/11 15:36:03 hxml Exp $++HXT_HOME	= ../../..+PKGFLAGS	= +GHCFLAGS	= -Wall -O2+GHC		= ghc $(GHCFLAGS) $(PKGFLAGS)++DIST		= $(HXT_HOME)/dist/examples/arrows+DIST_DIR	= $(DIST)/hparser++prog		= ./HXmlParser++all		: $(prog)++prof		:+		ghc --make -o $(prog) -Wall -prof -auto-all -O -fglasgow-exts -ignore-package hxt -ignore-package HTTP -i../../../src $(prog).hs++local		:+		ghc --make -o $(prog) $(GHCFLAGS) -fglasgow-exts -ignore-package hxt -i../../../src $(prog).hs++$(prog)		: HXmlParser.hs+		$(GHC) --make -o $@ $<++force		:+		$(GHC) --make -o $(prog) $(prog).hs++test		: $(prog)+		@echo "===> run a few simple test cases with the validating parser"+		@echo "===> first see all command line options"+		$(prog) --help+		@echo+		$(MAKE) test0 test1 test2 test3 test4++EX1		= ./example1.xml+EXi		= ./invalid.xml+EX2		= ../../xhtml/xhtml.xml+EX3		= ./namespace0.xml+EX3a		= ./namespace1.xml+EX4		= ./lousy.html+EX4a		= ./emptyElements.html++EX		= $(wildcard example*.xml) $(wildcard lousy*.html) $(wildcard empty*.html) $(wildcard *valid*.xml *valid*.rng) $(wildcard namespace*.xml)++test0		:+		@echo "===> a 1. simple valid document"+		$(prog) $(EX1)+		@echo+		@echo "===> the dom tree of the same document (without any redundant whitespace)"+		$(prog) --show-tree --remove-whitespace $(EX1)+		@echo+		@echo "===> the next test case contains validation erors, it must fail"+		$(prog) --verbose $(EXi) || true+		@echo+		@echo "===> same source, but only wellformed check"+		$(prog) --do-not-validate $(EXi) || true+		@echo+		@echo "===> only validation, no output of an XHTML source"+		$(prog) --verbose --no-output $(EX2)+		@echo++test1		:+		@echo "===> the source of a very simple valid document" ; echo ; sleep 2+		cat $(EX1)+		@sleep 2 ; echo ; echo "===> parser will emit UTF-8" ; echo ; sleep 2+		$(prog) --output-encoding=UTF-8 $(EX1)+		@echo+		@sleep 2 ; echo ; echo "===> once again with ISO-8859-1 (latin1) output" ; echo ; sleep 2+		$(prog) --output-encoding=ISO-8859-1 $(EX1)+		@echo+		@sleep 2 ; echo ; echo "===> once again with US-ASCII output" ; echo ; sleep 2+		$(prog) --output-encoding=US-ASCII $(EX1)+		@echo+		@sleep 2 ; echo ; echo "===> once again with hdom tree output" ; echo ; sleep 2+		$(prog) --show-tree --output-encoding=ISO-8859-1 $(EX1)+		@echo+		@sleep 2 ; echo ; echo "===> once again, but without any markup" ; echo ; sleep 2+		$(prog) --action=only-text --output-encoding=ISO-8859-1 $(EX1)+		@echo++test2		:+		@echo "===> the source of a xhtml document" ; echo ; sleep 2+		cat $(EX2)+		@echo "that document has" `cat $(EX2) | wc -l` "lines"+		@sleep 2 ; echo ; echo "===> parser will validate this document and try to indent the output" ; echo ; sleep 2+		$(prog) --indent $(EX2)+		@sleep 2 ; echo ; echo "===> once again, but remove all markup" ; echo ; sleep 2+		$(prog) --action=only-text --remove-whitespace $(EX2)+		@sleep 2 ; echo ; echo "===> once again with hdom tree output" ; echo ; sleep 2+		$(prog) --show-tree --remove-whitespace $(EX2)++test3		:+		@echo "===> namespace processing examples" ; echo ; sleep 2+		@echo "===> namespace propagation test" ; echo ; sleep 2+		$(prog) --verbose --check-namespaces  --indent --output-encoding=UTF-8 $(EX3)+		@echo+		@echo ; sleep 2 ; echo "===> namespace propagation test: tree output with attached namespaces" ; echo ; sleep 2+		$(prog) --verbose --check-namespaces  --remove-whitespace --show-tree --output-encoding=ISO-8859-1 $(EX3)+		@echo+		@echo ; sleep 2 ; echo "===> namespace validation test: this test produces namespace errors" ; echo ; sleep 2+		$(prog) --verbose --do-not-validate --check-namespaces --indent --output-encoding=ISO-8859-1 $(EX3a) || true+		@echo+++test4		:+		@echo "===> HTML parsing examples" ; echo ; sleep 2+		@echo "===> the source of a lousy html document" ; echo ; sleep 2+		cat $(EX4)+		@sleep 2 ; echo ; echo "===> parser accepts this document and tries to build a document tree" ; echo ; sleep 2+		$(prog) --indent --preserve-comment --parse-html $(EX4)+		@echo "===> the source of another lousy html document containing empty elements" ; echo ; sleep 2+		cat $(EX4a)+		@sleep 2 ; echo ; echo "===> parser accepts this document and tries to format this as a HTML document without any dangarous empty elements" ; echo ; sleep 2+		$(prog) --indent --preserve-comment --parse-html --output-html --no-empty-elements $(EX4a)+		@echo++dist		:+		[ -d $(DIST_DIR) ] || mkdir -p $(DIST_DIR)+		cp $(EX) Makefile $(prog).hs $(DIST_DIR)++clean		:+		rm -f $(prog) *.o *.hi++.PHONY		: all test test0 test1 test2 test3 test4 dist clean prof local force
+ examples/hparser/example1.xml view
@@ -0,0 +1,22 @@+<?xml version="1.0" encoding="ISO-8859-1" ?>++<!DOCTYPE a [+<!ATTLIST a  att1  NMTOKENS  #IMPLIED+             att2  ID        #REQUIRED>+<!ATTLIST b  btt2  ID        #REQUIRED+             btt3  IDREF     #REQUIRED>+<!ELEMENT a  (b, cü?)>+<!ELEMENT b  EMPTY>+<!ELEMENT cü (#PCDATA)>+]>++<?pi a processing instruction?>++<a att1=" test+          äöüß+          test "+   att2="root"+>+    <b btt2="b1" btt3="root"/>+    <cü>hello world äöüß test</cü>+</a>
+ examples/hparser/invalid.xml view
@@ -0,0 +1,13 @@+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>++<!DOCTYPE a [+<!ATTLIST a  att1  CDATA  #IMPLIED>+<!ELEMENT a  (z, c?)>+<!ELEMENT b  EMPTY>+<!ELEMENT c  (#PCDATA)>+]>++<a att2="test">+    <y/>+    <c>hello world</c>+</a>
+ examples/hparser/invalid1.xml view
@@ -0,0 +1,1 @@+<bar/>
+ examples/hparser/invalid2.rng view
@@ -0,0 +1,13 @@+<grammar xmlns:html="http://www.w3.org/TR/REC-html40" +         xmlns="http://relaxng.org/ns/structure/1.0" >+  <start>+    <element name="foo">+      <zeroOrMore>+        <group>+          <attribute name="bar"/>+          <attribute name="baz"/>+        </group>+      </zeroOrMore>+    </element>+  </start>+</grammar>
+ examples/hparser/invalid3.rng view
@@ -0,0 +1,19 @@+<grammar xmlns:html="http://www.w3.org/TR/REC-html40" +         xmlns="http://relaxng.org/ns/structure/1.0" >+  <start>+    <element name="foo">+      <zeroOrMore>+        <group>+          <attribute name="bar"/>+          <attribute name="baz"/>+        </group>+      </zeroOrMore>+    </element>+    <element name="bar">+      <group>+        <data type="token"/>+        <data type="token"/>+      </group>+    </element>+  </start>+</grammar>
+ examples/hparser/valid1.rng view
@@ -0,0 +1,7 @@+<grammar xmlns="http://relaxng.org/ns/structure/1.0">+  <start>+    <element name="foo">+      <empty/>+    </element>+  </start>+</grammar>
+ examples/hparser/valid1.xml view
@@ -0,0 +1,1 @@+<foo/>
+ examples/hrelaxng/HRelaxNG.hs view
@@ -0,0 +1,104 @@+-- |+-- HRelaxNG - Relax NG Validator of the Haskell XML Toolbox.+-- RELAX NG is a simpler schema language for XML.+--+-- Author : Torben Kuseler+--+-- This program may be used as example main program for the+-- Relax NG Validator.+--++module Main+where++import System.IO+import System.Environment+import System.Console.GetOpt+import System.Exit++import Text.XML.HXT.Core+import Text.XML.HXT.RelaxNG++-- ------------------------------------------------------------+++main :: IO ()+main+  = do+    argv <- getArgs                       -- get the commandline arguments+    (al, xml, schema) <- cmdlineOpts argv -- and evaluate them, return a key-value list+    [rc]  <- runX (relax al xml schema)   -- run the Relax NG validator +    exitProg (rc >= c_err)                -- set return code and terminate++relax :: SysConfigList -> String -> String -> IOSArrow b Int+relax al xml schema+    = configSysVars al+      >>>+      readDocument [withRelaxNG schema] xml+      >>>+      writeDocument [] "-"+      >>>+      getErrStatus+++exitProg        :: Bool -> IO a+exitProg True   = exitWith (ExitFailure (-1))+exitProg False  = exitWith ExitSuccess++++-- ------------------------------------------------------------+--+-- the options definition part+-- see doc for System.Console.GetOpt++progName    :: String+progName    = "HRelaxNGValidator"++options     :: [OptDescr SysConfig]+options+    = generalOptions+      +++      inputOptions+      +++      relaxOptions+      +++      outputOptions++usage :: [String] -> IO a+usage errl+    | null errl+        = do+          hPutStrLn stdout use+          exitProg False+    | otherwise+        = do+          hPutStrLn stderr (concat errl ++ "\n" ++ use)+          exitProg True+    where+    header = "HRelaxNGValidator - Relax NG schema validator of the " +++             "Haskell XML Toolbox with Arrow Interface\n\n" +++             "Usage: " ++ progName ++ " [OPTION...] (XML file URI/FILE) (Relax NG Schema URI/FILE)"+    use    = usageInfo header options++cmdlineOpts :: [String] -> IO (SysConfigList, String, String)+cmdlineOpts argv+    = case (getOpt Permute options argv) of+      (ol,n,[])+        -> do+           (xml, schema) <- src n+           help (getConfigAttr a_help ol)+           return (ol, xml, schema)+      (_,_,errs)+        -> usage errs+    where+    src [xml, schema] = return (xml, schema)+    src []  = usage ["XML file and Relax NG schema input file/url missing"]+    src [_] = usage ["Relax NG schema input file/url missing"]+    src _   = usage ["too many arguments"]++    help "1" = usage []+    help _   = return ()+++-- ------------------------------------------------------------
+ examples/hrelaxng/Makefile view
@@ -0,0 +1,77 @@+# $Id: Makefile,v 1.2 2005/09/30 14:41:44 hxml Exp $++HXT_HOME	= ../../..+PKGFLAGS	= +GHCFLAGS	= -Wall -O2+GHC		= ghc $(GHCFLAGS) $(PKGFLAGS)++DIST		= $(HXT_HOME)/dist/examples/arrows+DIST_DIR	= $(DIST)/hrelaxng++prog		= ./HRelaxNG++all		: $(prog)++prof		:+		ghc --make -o $(prog) -Wall -prof -auto-all -O -fglasgow-exts -ignore-package hxt -ignore-package HTTP -i../../../src $(prog).hs++local		:+		ghc --make -o $(prog) $(GHCFLAGS) -fglasgow-exts -ignore-package hxt -i../../../src $(prog).hs++$(prog)		: $(prog).hs+		$(GHC) --make -o $@ $<++force		:+		$(GHC) --make -o $(prog) $(prog).hs++test		: $(prog)+		@echo "===> Relax NG examples" ; echo ; sleep 1+		@$(MAKE) example1 example1a example2 example3 example5++example1	:+		@echo "===> Validate a valid Relax NG schema with respect to a valid xml file" ; echo ; sleep 1+		$(prog) ./valid1.xml ./valid1.rng+		@echo++example1a	:+		@echo "a valid document"+		$(prog) ./valid2.xml ./valid2.rng || true+		@echo++example1b	:+		@echo "===> 1. invalid document\n"+		$(prog) ./inv2.xml ./valid2.rng || true+		@echo "\n===> 2. invalid document\n"+		$(prog) ./inv3.xml ./valid2.rng || true+		@echo++example2	:+		@echo "===> Validate a valid Relax NG schema with respect to a invalid xml file" ; echo ; sleep 1+		$(prog) ./invalid1.xml ./valid1.rng || true+		@echo++example3	:+		@echo "===> Incorrect Relax NG schema" ; echo ; sleep 1+		$(prog) ./valid1.xml ./invalid2.rng || true+		@echo++example4	:+		@echo "===> Same example with \"--output-pattern-transformations\" option " ; echo ; sleep 1+		$(prog) --output-pattern-transformations  ./valid1.xml ./invalid2.rng || true+		@echo++example5	:+		@echo "===> Incorrect Relax NG schema with two errors" ; echo ; sleep 1+		$(prog) ./valid1.xml ./invalid3.rng || true+		@echo++EX		= $(wildcard *valid*.xml *valid*.rng)++dist		:+		[ -d $(DIST_DIR) ] || mkdir -p $(DIST_DIR)+		cp $(EX) Makefile $(prog).hs $(DIST_DIR)++clean		:+		rm -f $(prog) *.o *.hi++# eof ------------------------------------------------------------
+ examples/hrelaxng/invalid1.xml view
@@ -0,0 +1,1 @@+<bar/>
+ examples/hrelaxng/invalid2.rng view
@@ -0,0 +1,13 @@+<grammar xmlns:html="http://www.w3.org/TR/REC-html40" +         xmlns="http://relaxng.org/ns/structure/1.0" >+  <start>+    <element name="foo">+      <zeroOrMore>+        <group>+          <attribute name="bar"/>+          <attribute name="baz"/>+        </group>+      </zeroOrMore>+    </element>+  </start>+</grammar>
+ examples/hrelaxng/invalid3.rng view
@@ -0,0 +1,19 @@+<grammar xmlns:html="http://www.w3.org/TR/REC-html40" +         xmlns="http://relaxng.org/ns/structure/1.0" >+  <start>+    <element name="foo">+      <zeroOrMore>+        <group>+          <attribute name="bar"/>+          <attribute name="baz"/>+        </group>+      </zeroOrMore>+    </element>+    <element name="bar">+      <group>+        <data type="token"/>+        <data type="token"/>+      </group>+    </element>+  </start>+</grammar>
+ examples/hrelaxng/valid1.rng view
@@ -0,0 +1,7 @@+<grammar xmlns="http://relaxng.org/ns/structure/1.0">+  <start>+    <element name="foo">+      <empty/>+    </element>+  </start>+</grammar>
+ examples/hrelaxng/valid1.xml view
@@ -0,0 +1,1 @@+<foo/>
+ examples/hrelaxng/valid2.rng view
@@ -0,0 +1,27 @@+<grammar+  xmlns="http://relaxng.org/ns/structure/1.0"+  datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">+  <start>+    <ref name="foo"/>+  </start>+  +  <define name="foo">+    <element name="foo">++      <attribute name="string2-4">+	<data type="string">+	  <param name="minLength">2</param>+	  <param name="maxLength">4</param>+	</data>+      </attribute>++      <attribute name="id">+	<data type="ID">+	  <param name="length">4</param>+	</data>+      </attribute>+      +    </element>+  </define>++</grammar>
+ examples/hrelaxng/valid2.xml view
@@ -0,0 +1,1 @@+<foo string2-4="xxx" id="iooo"/>
+ hxt-relaxng.cabal view
@@ -0,0 +1,76 @@+-- arch-tag: Haskell XML Toolbox main description file+Name:           hxt-relaxng+Version:        9.0.0+Synopsis:       The HXT RelaxNG validator+Description:    The HXT RelaxNG validator+License:        OtherLicense+License-file:   LICENSE+Author:         Uwe Schmidt, Martin Schmidt, Torben Kuseler+Maintainer:     Uwe Schmidt <uwe@fh-wedel.de>+Stability:      Stable+Category:       XML+Homepage:       http://www.fh-wedel.de/~si/HXmlToolbox/index.html+Copyright:      Copyright (c) 2005-2010 Uwe Schmidt+Build-type:     Simple+Cabal-version:  >=1.6++extra-source-files:+ examples/hparser/example1.xml+ examples/hparser/HXmlParser.hs+ examples/hparser/invalid1.xml+ examples/hparser/invalid2.rng+ examples/hparser/invalid3.rng+ examples/hparser/invalid.xml+ examples/hparser/Makefile+ examples/hparser/valid1.rng+ examples/hparser/valid1.xml+ examples/hrelaxng/HRelaxNG.hs+ examples/hrelaxng/invalid1.xml+ examples/hrelaxng/invalid2.rng+ examples/hrelaxng/invalid3.rng+ examples/hrelaxng/Makefile+ examples/hrelaxng/valid1.rng+ examples/hrelaxng/valid1.xml+ examples/hrelaxng/valid2.rng+ examples/hrelaxng/valid2.xml++library+ exposed-modules:+  Text.XML.HXT.RelaxNG,+  Text.XML.HXT.RelaxNG.BasicArrows,+  Text.XML.HXT.RelaxNG.CreatePattern,+  Text.XML.HXT.RelaxNG.DataTypeLibMysql,+  Text.XML.HXT.RelaxNG.DataTypeLibUtils,+  Text.XML.HXT.RelaxNG.DataTypeLibraries,+  Text.XML.HXT.RelaxNG.DataTypes,+  Text.XML.HXT.RelaxNG.PatternFunctions,+  Text.XML.HXT.RelaxNG.PatternToString,+  Text.XML.HXT.RelaxNG.Schema,+  Text.XML.HXT.RelaxNG.SchemaGrammar,+  Text.XML.HXT.RelaxNG.Simplification,+  Text.XML.HXT.RelaxNG.SystemConfig,+  Text.XML.HXT.RelaxNG.Utils,+  Text.XML.HXT.RelaxNG.Validation,+  Text.XML.HXT.RelaxNG.Validator,+  Text.XML.HXT.RelaxNG.XMLSchema.DataTypeLibW3C++ hs-source-dirs: src++ ghc-options: -Wall++ -- extensions: MultiParamTypeClasses DeriveDataTypeable FunctionalDependencies FlexibleInstances++ build-depends: base       >= 4   && < 5,+                haskell98  >= 1   && < 2,+                containers >= 0.2 && < 1,+                directory  >= 1   && < 2,+                -- filepath   >= 1   && < 2,+                parsec     >= 2.1 && < 4,+                -- HUnit      >= 1.2 && < 2,+                network    >= 2.1 && < 3,+                -- deepseq    >= 1.1 && < 2,+                -- bytestring >= 0.9 && < 1,+                -- hxt-charproperties  >= 9 && < 10,+                hxt                 >= 9 && < 10,+                hxt-charproperties  >= 9 && < 10,+                hxt-regex-xmlschema >= 9 && < 10
+ src/Text/XML/HXT/RelaxNG.hs view
@@ -0,0 +1,37 @@+-- ------------------------------------------------------------++{- |+   Module     : Text.XML.HXT.RelaxNG+   Copyright  : Copyright (C) 2010 Uwe Schmidt, Torben Kuseler+   License    : MIT++   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+   Stability  : stable+   Portability: portable++   This helper module exports elements from the basic Relax NG libraries:+   Validator, CreatePattern, PatternToString and DataTypes.+   It is the main entry point to the Relax NG schema validator of the Haskell+   XML Toolbox.++-}++-- ------------------------------------------------------------++module Text.XML.HXT.RelaxNG+  ( module Text.XML.HXT.RelaxNG.PatternToString+  , module Text.XML.HXT.RelaxNG.Validator+  , module Text.XML.HXT.RelaxNG.DataTypes+  , module Text.XML.HXT.RelaxNG.CreatePattern+  , module Text.XML.HXT.RelaxNG.SystemConfig+  )+where++import Text.XML.HXT.RelaxNG.PatternToString+import Text.XML.HXT.RelaxNG.Validator+import Text.XML.HXT.RelaxNG.DataTypes+import Text.XML.HXT.RelaxNG.CreatePattern+import Text.XML.HXT.RelaxNG.SystemConfig++-- ------------------------------------------------------------+
+ src/Text/XML/HXT/RelaxNG/BasicArrows.hs view
@@ -0,0 +1,326 @@+-- ------------------------------------------------------------++{- |+   Module     : Text.XML.HXT.RelaxNG.BasicArrows+   Copyright  : Copyright (C) 2005 Uwe Schmidt+   License    : MIT++   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+   Stability  : experimental+   Portability: portable+   Version    : $Id$++   Constants and basic arrows for Relax NG++-}++-- ------------------------------------------------------------++module Text.XML.HXT.RelaxNG.BasicArrows+where++import Control.Arrow.ListArrows++import Text.XML.HXT.DOM.Interface+import Text.XML.HXT.Arrow.XmlArrow+    hiding+    ( mkText+    , mkError+    )++hasRngName      :: ArrowXml a => String -> a XmlTree XmlTree+hasRngName s+    = hasName s+      `orElse`+      ( hasLocalPart s >>> hasNamespaceUri relaxNamespace )++checkRngName :: ArrowXml a => [String] -> a XmlTree XmlTree+checkRngName l+    = ( isElem+        >>>+        catA (map hasRngName l)+      )+      `guards` this++noOfChildren    :: ArrowXml a => (Int -> Bool) -> a XmlTree XmlTree+noOfChildren p+    = getChildren+      >>.+      (\ l -> if p (length l) then l else [])++-- ------------------------------------------------------------++isAttributeRef  :: ArrowXml a => a XmlTree XmlTree+isAttributeRef+    = checkRngName ["attribute", "ref"]++isAttributeRefTextListGroupInterleaveOneOrMoreEmpty     :: ArrowXml a => a XmlTree XmlTree+isAttributeRefTextListGroupInterleaveOneOrMoreEmpty+    = checkRngName ["attribute", "ref", "text", "list", "group", "interleave", "oneOrMore", "empty"]++isAttributeRefTextListInterleave        :: ArrowXml a => a XmlTree XmlTree+isAttributeRefTextListInterleave+    = checkRngName ["attribute", "ref", "text", "list", "interleave"]++isAttributeListGroupInterleaveOneOrMore :: ArrowXml a => a XmlTree XmlTree+isAttributeListGroupInterleaveOneOrMore+    = checkRngName ["attribute", "list", "group", "interleave", "oneOrMore"]++isExternalRefInclude    :: ArrowXml a => a XmlTree XmlTree+isExternalRefInclude+    = checkRngName ["externalRef", "include"]++isNameNsNameValue       :: ArrowXml a => a XmlTree XmlTree+isNameNsNameValue+    = checkRngName ["name", "nsName", "value"]++isNameNsName    :: ArrowXml a => a XmlTree XmlTree+isNameNsName+    = checkRngName ["name", "nsName"]++isNameAnyNameNsName     :: ArrowXml a => a XmlTree XmlTree+isNameAnyNameNsName+    = checkRngName ["name", "anyName", "nsName"]++isDefineOneOrMoreZeroOrMoreOptionalListMixed    :: ArrowXml a => a XmlTree XmlTree+isDefineOneOrMoreZeroOrMoreOptionalListMixed+    = checkRngName ["define", "oneOrMore", "zeroOrMore", "optional", "list", "mixed"]++isChoiceGroupInterleave :: ArrowXml a => a XmlTree XmlTree+isChoiceGroupInterleave+    = checkRngName ["choice", "group", "interleave"]++isChoiceGroupInterleaveOneOrMore        :: ArrowXml a => a XmlTree XmlTree+isChoiceGroupInterleaveOneOrMore+    = checkRngName ["choice", "group", "interleave", "oneOrMore"]++isGroupInterleave       :: ArrowXml a => a XmlTree XmlTree+isGroupInterleave+    = checkRngName ["group", "interleave"]++-- ------------------------------------------------------------++isRngAnyName            :: ArrowXml a => a XmlTree XmlTree+isRngAnyName            = isElem >>> hasRngName "anyName"++isRngAttribute          :: ArrowXml a => a XmlTree XmlTree+isRngAttribute          = isElem >>> hasRngName "attribute"++isRngChoice             :: ArrowXml a => a XmlTree XmlTree+isRngChoice             = isElem >>> hasRngName "choice"++isRngCombine            :: ArrowXml a => a XmlTree XmlTree+isRngCombine            = isElem >>> hasRngName "combine"++isRngData               :: ArrowXml a => a XmlTree XmlTree+isRngData               = isElem >>> hasRngName "data"++isRngDefine             :: ArrowXml a => a XmlTree XmlTree+isRngDefine             = isElem >>> hasRngName "define"++isRngDiv                :: ArrowXml a => a XmlTree XmlTree+isRngDiv                = isElem >>> hasRngName "div"++isRngElement            :: ArrowXml a => a XmlTree XmlTree+isRngElement            = isElem >>> hasRngName "element"++isRngEmpty              :: ArrowXml a => a XmlTree XmlTree+isRngEmpty              = isElem >>> hasRngName "empty"++isRngExcept             :: ArrowXml a => a XmlTree XmlTree+isRngExcept             = isElem >>> hasRngName "except"++isRngExternalRef        :: ArrowXml a => a XmlTree XmlTree+isRngExternalRef        = isElem >>> hasRngName "externalRef"++isRngGrammar            :: ArrowXml a => a XmlTree XmlTree+isRngGrammar            = isElem >>> hasRngName "grammar"++isRngGroup              :: ArrowXml a => a XmlTree XmlTree+isRngGroup              = isElem >>> hasRngName "group"++isRngInclude            :: ArrowXml a => a XmlTree XmlTree+isRngInclude            = isElem >>> hasRngName "include"++isRngInterleave         :: ArrowXml a => a XmlTree XmlTree+isRngInterleave         = isElem >>> hasRngName "interleave"++isRngList               :: ArrowXml a => a XmlTree XmlTree+isRngList               = isElem >>> hasRngName "list"++isRngMixed              :: ArrowXml a => a XmlTree XmlTree+isRngMixed              = isElem >>> hasRngName "mixed"++isRngName               :: ArrowXml a => a XmlTree XmlTree+isRngName               = isElem >>> hasRngName "name"++isRngNotAllowed         :: ArrowXml a => a XmlTree XmlTree+isRngNotAllowed         = isElem >>> hasRngName "notAllowed"++isRngNsName             :: ArrowXml a => a XmlTree XmlTree+isRngNsName             = isElem >>> hasRngName "nsName"++isRngOneOrMore          :: ArrowXml a => a XmlTree XmlTree+isRngOneOrMore          = isElem >>> hasRngName "oneOrMore"++isRngOptional           :: ArrowXml a => a XmlTree XmlTree+isRngOptional           = isElem >>> hasRngName "optional"++isRngParam              :: ArrowXml a => a XmlTree XmlTree+isRngParam              = isElem >>> hasRngName "param"++isRngParentRef          :: ArrowXml a => a XmlTree XmlTree+isRngParentRef          = isElem >>> hasRngName "parentRef"++isRngRef                :: ArrowXml a => a XmlTree XmlTree+isRngRef                = isElem >>> hasRngName "ref"++isRngRelaxError         :: ArrowXml a => a XmlTree XmlTree+isRngRelaxError         = isElem >>> hasRngName "relaxError"++isRngStart              :: ArrowXml a => a XmlTree XmlTree+isRngStart              = isElem >>> hasRngName "start"++isRngText               :: ArrowXml a => a XmlTree XmlTree+isRngText               = isElem >>> hasRngName "text"++isRngType               :: ArrowXml a => a XmlTree XmlTree+isRngType               = isElem >>> hasRngName "type"++isRngValue              :: ArrowXml a => a XmlTree XmlTree+isRngValue              = isElem >>> hasRngName "value"++isRngZeroOrMore         :: ArrowXml a => a XmlTree XmlTree+isRngZeroOrMore         = isElem >>> hasRngName "zeroOrMore"++-- ------------------------------------------------------------++mkRngElement            :: ArrowXml a => String -> a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngElement n          = mkElement (mkQName "" n relaxNamespace)++mkRngChoice             :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngChoice             = mkRngElement "choice"++mkRngDefine             :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngDefine             = mkRngElement "define"++mkRngEmpty              :: ArrowXml a => a n XmlTree -> a n XmlTree+mkRngEmpty a            = mkRngElement "empty" a none++mkRngGrammar            :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngGrammar            = mkRngElement "grammar"++mkRngGroup              :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngGroup              = mkRngElement "group"++mkRngInterleave         :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngInterleave         = mkRngElement "interleave"++mkRngName               :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngName               = mkRngElement "name"++mkRngNotAllowed         :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngNotAllowed         = mkRngElement "notAllowed"++mkRngOneOrMore          :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngOneOrMore          = mkRngElement "oneOrMore"++mkRngRef                :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngRef                = mkRngElement "ref"++mkRngRelaxError         :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngRelaxError         = mkRngElement "relaxError"++mkRngStart              :: ArrowXml a => a n XmlTree -> a n XmlTree -> a n XmlTree+mkRngStart              = mkRngElement "start"++mkRngText               :: ArrowXml a => a n XmlTree -> a n XmlTree+mkRngText a             = mkRngElement "text" a none++-- ------------------------------------------------------------++setRngName              :: ArrowXml a => String -> a XmlTree XmlTree+setRngName n            = setElemName (mkQName "" n relaxNamespace)++setRngNameDiv           :: ArrowXml a => a XmlTree XmlTree+setRngNameDiv           = setRngName "div"++setRngNameRef           :: ArrowXml a => a XmlTree XmlTree+setRngNameRef           = setRngName "ref"++-- ------------------------------------------------------------++-- Attributes++isRngAttrAttribute              :: ArrowXml a => a XmlTree XmlTree+isRngAttrAttribute              = isAttr >>> hasRngName "attribute"++isRngAttrCombine                :: ArrowXml a => a XmlTree XmlTree+isRngAttrCombine                = isAttr >>> hasRngName "combine"++isRngAttrDatatypeLibrary        :: ArrowXml a => a XmlTree XmlTree+isRngAttrDatatypeLibrary        = isAttr >>> hasRngName "datatypeLibrary"++isRngAttrHref                   :: ArrowXml a => a XmlTree XmlTree+isRngAttrHref                   = isAttr >>> hasRngName "href"++isRngAttrName                   :: ArrowXml a => a XmlTree XmlTree+isRngAttrName                   = isAttr >>> hasRngName "name"++isRngAttrNs                     :: ArrowXml a => a XmlTree XmlTree+isRngAttrNs                     = isAttr >>> hasRngName "ns"++isRngAttrType                   :: ArrowXml a => a XmlTree XmlTree+isRngAttrType                   = isAttr >>> hasRngName "type"++-- ------------------------------------------------------------++hasRngAttrAttribute             :: ArrowXml a => a XmlTree XmlTree+hasRngAttrAttribute             = hasAttr "attribute"++hasRngAttrCombine               :: ArrowXml a => a XmlTree XmlTree+hasRngAttrCombine               = hasAttr "combine"++hasRngAttrDatatypeLibrary       :: ArrowXml a => a XmlTree XmlTree+hasRngAttrDatatypeLibrary       = hasAttr "datatypeLibrary"++hasRngAttrHref                  :: ArrowXml a => a XmlTree XmlTree+hasRngAttrHref                  = hasAttr "href"++hasRngAttrName                  :: ArrowXml a => a XmlTree XmlTree+hasRngAttrName                  = hasAttr "name"++hasRngAttrNs                    :: ArrowXml a => a XmlTree XmlTree+hasRngAttrNs                    = hasAttr "ns"++hasRngAttrType                  :: ArrowXml a => a XmlTree XmlTree+hasRngAttrType                  = hasAttr "type"++-- ------------------------------------------------------------++getRngAttrAttribute             :: ArrowXml a => a XmlTree String+getRngAttrAttribute             = getAttrValue "attribute"++getRngAttrCombine               :: ArrowXml a => a XmlTree String+getRngAttrCombine               = getAttrValue "combine"++getRngAttrDatatypeLibrary       :: ArrowXml a => a XmlTree String+getRngAttrDatatypeLibrary       = getAttrValue "datatypeLibrary"++getRngAttrDescr                 :: ArrowXml a => a XmlTree String+getRngAttrDescr                 = getAttrValue "descr"++getRngAttrHref                  :: ArrowXml a => a XmlTree String+getRngAttrHref                  = getAttrValue "href"++getRngAttrName                  :: ArrowXml a => a XmlTree String+getRngAttrName                  = getAttrValue "name"++getRngAttrNs                    :: ArrowXml a => a XmlTree String+getRngAttrNs                    = getAttrValue "ns"++getRngAttrType                  :: ArrowXml a => a XmlTree String+getRngAttrType                  = getAttrValue "type"++-- ------------------------------------------------------------+
+ src/Text/XML/HXT/RelaxNG/CreatePattern.hs view
@@ -0,0 +1,349 @@+-- |+--+-- Creates the 'Pattern' datastructure from a simplified Relax NG schema.+-- The created datastructure is used in the validation algorithm+-- (see also: "Text.XML.HXT.RelaxNG.Validation")++module Text.XML.HXT.RelaxNG.CreatePattern+  ( createPatternFromXmlTree+  , createNameClass+  , firstChild+  , lastChild+  , module Text.XML.HXT.RelaxNG.PatternFunctions+  )+where++import Control.Arrow.ListArrows++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.XmlArrow++import Text.XML.HXT.RelaxNG.DataTypes+import Text.XML.HXT.RelaxNG.BasicArrows+import Text.XML.HXT.RelaxNG.PatternFunctions++import Data.Maybe+    ( fromMaybe )++import Data.List+    ( isPrefixOf )++-- ------------------------------------------------------------++-- | Creates the 'Pattern' datastructure from a simplified Relax NG schema.++createPatternFromXmlTree :: LA XmlTree Pattern+createPatternFromXmlTree = createPatternFromXml $< createEnv+ where+ -- | Selects all define-pattern and creates an environment list.+ -- Each list entry maps the define name to the children of the define-pattern.+ -- The map is used to replace a ref-pattern with the referenced define-pattern.+ createEnv :: LA XmlTree Env+ createEnv = listA $ deep isRngDefine+                     >>>+                     (getRngAttrName &&& getChildren)+++-- | Transforms each XML-element to the corresponding pattern++createPatternFromXml :: Env -> LA XmlTree Pattern+createPatternFromXml env+ = choiceA [+     isRoot                            :-> processRoot env,+     isRngEmpty      :-> constA Empty,+     isRngNotAllowed :-> mkNotAllowed,+     isRngText       :-> constA Text,+     isRngChoice     :-> mkRelaxChoice env,+     isRngInterleave :-> mkRelaxInterleave env,+     isRngGroup      :-> mkRelaxGroup env,+     isRngOneOrMore  :-> mkRelaxOneOrMore env,+     isRngList       :-> mkRelaxList env,+     isRngData       :-> mkRelaxData env,+     isRngValue      :-> mkRelaxValue,+     isRngAttribute  :-> mkRelaxAttribute env,+     isRngElement    :-> mkRelaxElement env,+     isRngRef        :-> mkRelaxRef env,+     this                              :-> mkRelaxError ""+   ]+++processRoot :: Env -> LA XmlTree Pattern+processRoot env+  = getChildren+    >>>+    choiceA [+      isRngRelaxError :-> (mkRelaxError $< getRngAttrDescr),+      isRngGrammar    :-> (processGrammar env),+      this                              :-> (mkRelaxError "no grammar-pattern in schema")+    ]+++processGrammar :: Env -> LA XmlTree Pattern+processGrammar env+  = getChildren+    >>>+    choiceA [+      isRngDefine     :-> none,+      isRngRelaxError :-> (mkRelaxError $< getAttrValue "desc"),+      isRngStart      :-> (getChildren >>> createPatternFromXml env),+      this            :-> (mkRelaxError "no start-pattern in schema")+    ]+++{- |+  Transforms a ref-element.+  The value of the name-attribute is looked up in the environment list+  to find the corresponding define-pattern.+  Haskells lazy-evaluation is used to transform circular structures.+-}+mkRelaxRef :: Env -> LA XmlTree Pattern+mkRelaxRef e+ = getRngAttrName+   >>>+   arr (\n -> fromMaybe (notAllowed $ "define-pattern with name " ++ n ++ " not found")+              . lookup n $ transformEnv e+       )+ where+ transformEnv :: [(String, XmlTree)] -> [(String, Pattern)]+ transformEnv env = [ (treeName, (transformEnvElem tree env)) | (treeName, tree) <- env]+ transformEnvElem :: XmlTree -> [(String, XmlTree)] -> Pattern+ transformEnvElem tree env = head $ runLA (createPatternFromXml env) tree+++-- | Transforms a notAllowed-element.+mkNotAllowed :: LA XmlTree Pattern+mkNotAllowed = constA $ notAllowed "notAllowed-pattern in Relax NG schema definition"+++-- | Creates an error message.+mkRelaxError :: String -> LA XmlTree Pattern+mkRelaxError errStr+ = choiceA [+     isRngRelaxError :-> (getRngAttrDescr >>> arr notAllowed),+     isElem  :-> ( getName+                   >>>+                   arr (\n -> notAllowed $ "Pattern " ++ n +++                                           " is not allowed in Relax NG schema"+                       )+                 ),+     isAttr  :-> ( getName+                   >>>+                   arr (\n -> notAllowed $ "Attribute " ++ n +++                                           " is not allowed in Relax NG schema"+                       )+                 ),+     isError :-> (getErrorMsg >>> arr notAllowed),+     this    :-> (arr (\e -> notAllowed $ if errStr /= ""+                                          then errStr+                                          else "Can't create pattern from " ++ show e)+                 )+   ]+++-- | Transforms a choice-element.+mkRelaxChoice :: Env -> LA XmlTree Pattern+mkRelaxChoice env+    = ifA ( getChildren >>.+            ( \ l -> if length l == 1 then l else [] )+          )+      ( createPatternFromXml env )+      ( getTwoChildrenPattern env >>> arr2 Choice )++-- | Transforms a interleave-element.+mkRelaxInterleave :: Env -> LA XmlTree Pattern+mkRelaxInterleave env+    = getTwoChildrenPattern env+      >>>+      arr2 Interleave+++-- | Transforms a group-element.+mkRelaxGroup :: Env -> LA XmlTree Pattern+mkRelaxGroup env+    = getTwoChildrenPattern env+      >>>+      arr2 Group+++-- | Transforms a oneOrMore-element.+mkRelaxOneOrMore :: Env -> LA XmlTree Pattern+mkRelaxOneOrMore env+    = getOneChildPattern env+      >>>+      arr OneOrMore+++-- | Transforms a list-element.+mkRelaxList :: Env -> LA XmlTree Pattern+mkRelaxList env+    = getOneChildPattern env+      >>>+      arr List+++-- | Transforms a data- or dataExcept-element.+mkRelaxData :: Env -> LA XmlTree Pattern+mkRelaxData env+  = ifA (getChildren >>> isRngExcept)+     (processDataExcept >>> arr3 DataExcept)+     (processData >>> arr2 Data)+  where+  processDataExcept :: LA XmlTree (Datatype, (ParamList, Pattern))+  processDataExcept = getDatatype &&& getParamList &&&+                      ( getChildren+                        >>>+                        isRngExcept+                        >>>+                        getChildren+                        >>>+                        createPatternFromXml env+                      )+  processData :: LA XmlTree (Datatype, ParamList)+  processData = getDatatype &&& getParamList+  getParamList :: LA XmlTree ParamList+  getParamList = listA $ getChildren+                         >>>+                         isRngParam+                         >>>+                         (getRngAttrName &&& (getChildren >>> getText))+++-- | Transforms a value-element.+mkRelaxValue :: LA XmlTree Pattern+mkRelaxValue = getDatatype &&& getValue &&& getContext+               >>>+               arr3 Value+  where+  getContext :: LA XmlTree Context+  getContext = getAttrValue contextBaseAttr &&& getMapping+  getMapping :: LA XmlTree [(Prefix, Uri)]+  getMapping = listA $ getAttrl >>>+                       ( (getName >>> isA (contextAttributes `isPrefixOf`))+                         `guards`+                         ( (getName >>> arr (drop $ length contextAttributes))+                           &&&+                           (getChildren >>> getText)+                         )+                       )+  getValue :: LA XmlTree String+  getValue = (getChildren >>> getText) `orElse` (constA "")+++getDatatype :: LA XmlTree Datatype+getDatatype = getRngAttrDatatypeLibrary+              &&&+              getRngAttrType+++-- | Transforms a attribute-element.+-- The first child is a 'NameClass', the second (the last) one a pattern.++mkRelaxAttribute :: Env -> LA XmlTree Pattern+mkRelaxAttribute env+    = ( ( firstChild >>> createNameClass )+        &&&+        ( lastChild >>> createPatternFromXml env )+      )+      >>>+      arr2 Attribute++-- | Transforms a element-element.+-- The first child is a 'NameClass', the second (the last) one a pattern.+mkRelaxElement :: Env -> LA XmlTree Pattern+mkRelaxElement env+    = ( ( firstChild >>> createNameClass )+        &&&+        ( lastChild >>> createPatternFromXml env )+      )+      >>>+      arr2 Element+++-- | Creates a 'NameClass' from an \"anyName\"-, \"nsName\"- or  \"name\"-Pattern,+createNameClass :: LA XmlTree NameClass+createNameClass+    = choiceA+      [ isRngAnyName :-> processAnyName+      , isRngNsName  :-> processNsName+      , isRngName    :-> processName+      , isRngChoice  :-> processChoice+      , this         :-> mkNameClassError+      ]+    where+    processAnyName :: LA XmlTree NameClass+    processAnyName+        = ifA (getChildren >>> isRngExcept)+          ( getChildren+            >>> getChildren+            >>> createNameClass+            >>> arr AnyNameExcept+          )+         ( constA AnyName )++    processNsName :: LA XmlTree NameClass+    processNsName+        = ifA (getChildren >>> isRngExcept)+          ( ( getRngAttrNs+              &&&+              ( getChildren >>> getChildren >>> createNameClass )+            )+            >>>+            arr2 NsNameExcept+          )+          ( getRngAttrNs >>> arr NsName )++    processName :: LA XmlTree NameClass+    processName+        = (getRngAttrNs &&& (getChildren >>> getText)) >>> arr2 Name++    processChoice :: LA XmlTree NameClass+    processChoice+        = ( ( firstChild >>> createNameClass )+            &&&+            ( lastChild  >>> createNameClass )+          )+          >>>+          arr2 NameClassChoice++mkNameClassError :: LA XmlTree NameClass+mkNameClassError+    = choiceA [ isRngRelaxError+                        :-> ( getRngAttrDescr+                              >>>+                              arr NCError+                         )+              , isElem  :-> ( getName+                              >>>+                              arr (\n -> NCError ("Can't create name class from element " ++ n))+                            )+              , isAttr  :-> ( getName+                              >>>+                              arr (\n -> NCError ("Can't create name class from attribute: " ++ n))+                            )+              , isError :-> ( getErrorMsg+                              >>>+                              arr NCError+                            )+              , this    :-> ( arr (\e ->  NCError $ "Can't create name class from " ++ show e) )+              ]+++getOneChildPattern :: Env -> LA XmlTree Pattern+getOneChildPattern env+    = firstChild >>> createPatternFromXml env+++getTwoChildrenPattern :: Env -> LA XmlTree (Pattern, Pattern)+getTwoChildrenPattern env+    = ( getOneChildPattern env )+        &&&+        ( lastChild  >>> createPatternFromXml env )++-- | Simple access arrows++firstChild      :: (ArrowTree a, Tree t) => a (t b) (t b)+firstChild      = single getChildren++lastChild       :: (ArrowTree a, Tree t) => a (t b) (t b)+lastChild       = getChildren >>. (take 1 . reverse)
+ src/Text/XML/HXT/RelaxNG/DataTypeLibMysql.hs view
@@ -0,0 +1,168 @@+-- |+-- Datatype library for the MySQL datatypes+--++module Text.XML.HXT.RelaxNG.DataTypeLibMysql+  ( mysqlNS+  , mysqlDatatypeLib+  )+where++import Text.XML.HXT.RelaxNG.DataTypeLibUtils++import Data.Maybe++-- ------------------------------------------------------------++-- | Namespace of the MySQL datatype library++mysqlNS :: String+mysqlNS = "http://www.mysql.com"+++-- | The main entry point to the MySQL datatype library.+--+-- The 'DTC' constructor exports the list of supported datatypes and params.+-- It also exports the specialized functions to validate a XML instance value with+-- respect to a datatype.++mysqlDatatypeLib :: DatatypeLibrary+mysqlDatatypeLib = (mysqlNS, DTC datatypeAllowsMysql datatypeEqualMysql mysqlDatatypes)+++-- | All supported datatypes of the library+mysqlDatatypes :: AllowedDatatypes+mysqlDatatypes = [ -- numeric types+                   ("SIGNED-TINYINT", numericParams)+                 , ("UNSIGNED-TINYINT", numericParams)+                 , ("SIGNED-SMALLINT", numericParams)+                 , ("UNSIGNED-SMALLINT", numericParams)+                 , ("SIGNED-MEDIUMINT", numericParams)+                 , ("UNSIGNED-MEDIUMINT", numericParams)+                 , ("SIGNED-INT", numericParams)+                 , ("UNSIGNED-INT", numericParams)+                 , ("SIGNED-BIGINT", numericParams)+                 , ("UNSIGNED-BIGINT", numericParams)++                 -- string types+                 , ("CHAR", stringParams)+                 , ("VARCHAR", stringParams)+                 , ("BINARY", stringParams)+                 , ("VARBINARY", stringParams)+                 , ("TINYTEXT", stringParams)+                 , ("TINYBLOB", stringParams)+                 , ("TEXT", stringParams)+                 , ("BLOB", stringParams)+                 , ("MEDIUMTEXT", stringParams)+                 , ("MEDIUMBLOB", stringParams)+                 , ("LONGTEXT", stringParams)+                 , ("LONGBLOB", stringParams)+                 ]+++-- | List of supported string datatypes+stringTypes :: [String]+stringTypes = [ "CHAR"+              , "VARCHAR"+              , "BINARY"+              , "VARBINARY"+              , "TINYTEXT"+              , "TINYBLOB"+              , "TEXT"+              , "BLOB"+              , "MEDIUMTEXT"+              , "MEDIUMBLOB"+              , "LONGTEXT"+              , "LONGBLOB"+              ]+++-- | List of supported numeric datatypes+numericTypes :: [String]+numericTypes = [ "SIGNED-TINYINT"+               , "UNSIGNED-TINYINT"+               , "SIGNED-SMALLINT"+               , "UNSIGNED-SMALLINT"+               , "SIGNED-MEDIUMINT"+               , "UNSIGNED-MEDIUMINT"+               , "SIGNED-INT"+               , "UNSIGNED-INT"+               , "SIGNED-BIGINT"+               , "UNSIGNED-BIGINT"+               ]+++-- | List of allowed params for the numeric datatypes+numericParams :: AllowedParams+numericParams = [ rng_maxExclusive+                , rng_minExclusive+                , rng_maxInclusive+                , rng_minInclusive+                ]+++-- | List of allowed params for the string datatypes+stringParams :: AllowedParams+stringParams = [ rng_length+               , rng_maxLength+               , rng_minLength+               ]++-- ------------------------------------------------------------+--+-- | Tests whether a XML instance value matches a data-pattern.++datatypeAllowsMysql :: DatatypeAllows+datatypeAllowsMysql d params value _+    = performCheck check value+    where+    check+        | isJust ndt    = checkNum (fromJust ndt)+        | isJust sdt    = checkStr (fromJust sdt)+        | otherwise     = failure $ errorMsgDataTypeNotAllowed mysqlNS d params+    checkNum r  = uncurry (numberValid d) r params+    checkStr r  = uncurry (stringValid d) r params+    ndt = lookup d $+          [ ("SIGNED-TINYINT", ((-128), 127))+          , ("UNSIGNED-TINYINT", (0, 255))+          , ("SIGNED-SMALLINT", ((-32768), 32767))+          , ("UNSIGNED-SMALLINT", (0, 65535))+          , ("SIGNED-MEDIUMINT", ((-8388608), 8388607))+          , ("UNSIGNED-MEDIUMINT", (0, 16777215))+          , ("SIGNED-INT", ((-2147483648), 2147483647))+          , ("UNSIGNED-INT", (0, 4294967295))+          , ("SIGNED-BIGINT", ((-9223372036854775808), 9223372036854775807))+          , ("UNSIGNED-BIGINT", (0, 18446744073709551615))+          ]+    sdt = lookup d $+          [ ("CHAR", (0, 255))+          , ("VARCHAR", (0, 65535))+          , ("BINARY", (0, 255))+          , ("VARBINARY", (0, 65535))+          , ("TINYTEXT", (0, 256))+          , ("TINYBLOB", (0, 256))+          , ("TEXT", (0, 65536))+          , ("BLOB", (0, 65536))+          , ("MEDIUMTEXT", (0, 16777216))+          , ("MEDIUMBLOB", (0, 16777216))+          , ("LONGTEXT", (0, 4294967296))+          , ("LONGBLOB", (0, 4294967296))+          ]++-- ------------------------------------------------------------++-- | Tests whether a XML instance value matches a value-pattern.++datatypeEqualMysql :: DatatypeEqual+datatypeEqualMysql d s1 _ s2 _+    = performCheck check (s1, s2)+      where+      cmp nf    = arr (\ (x1, x2) -> (nf x1, nf x2))+                  >>>+                  assert (uncurry (==)) (uncurry $ errorMsgEqual d)+      check+          | d `elem` stringTypes        = cmp id+          | d `elem` numericTypes       = cmp normalizeNumber+          | otherwise                   = failure $ const (errorMsgDataTypeNotAllowed0 mysqlNS d)++-- ------------------------------------------------------------
+ src/Text/XML/HXT/RelaxNG/DataTypeLibUtils.hs view
@@ -0,0 +1,407 @@+-- |+-- exports helper functions for the integration of new datatype-libraries++module Text.XML.HXT.RelaxNG.DataTypeLibUtils+  ( errorMsgEqual+  , errorMsgDataTypeNotAllowed+  , errorMsgDataTypeNotAllowed0+  , errorMsgDataTypeNotAllowed2+  , errorMsgDataLibQName+  , errorMsgParam++  , rng_length+  , rng_maxLength+  , rng_minLength+   ,rng_maxExclusive+  , rng_minExclusive+  , rng_maxInclusive+  , rng_minInclusive++  , module Control.Arrow+  , module Text.XML.HXT.DOM.Util+  , module Text.XML.HXT.RelaxNG.Utils+  , module Text.XML.HXT.RelaxNG.DataTypes++  , FunctionTable++  , stringValidFT       -- generalized checkString+  , fctTableString      -- minLength, maxLenght, length+  , fctTableList        -- minLength, maxLenght, length++  , stringValid         -- checkString+  , numberValid         -- checkNumeric++  , numParamValid++  , CheckA              -- Check datatype+  , CheckString         -- CheckA String String+  , CheckInteger        -- CheckA Integer Integer++  , performCheck        -- run a CheckA+  , ok                  -- always true+  , failure             -- create an error meesage+  , assert              -- create a primitive check from a predicate+  , assertMaybe         -- create a primitive check from a maybe+  , checkWith           -- convert value before checking+  )++where+import Prelude hiding (id, (.))++import Control.Category+import Control.Arrow++import Data.Maybe++import Text.XML.HXT.DOM.Util++import Text.XML.HXT.RelaxNG.DataTypes+import Text.XML.HXT.RelaxNG.Utils++-- ------------------------------------------------------------++newtype CheckA a b      = C { runCheck :: a -> Either String b }++instance Category CheckA where+    id          = C $ Right++    f2 . f1     = C $                           -- logical and: f1 and f2 must hold+                  \ x -> case runCheck f1 x of+                         Right y        -> runCheck f2 y+                         Left  e        -> Left e++instance Arrow CheckA where+    arr f       = C ( Right . f )               -- unit: no check, always o.k., just a conversion++    first f1    = C $                           -- check 1. component of a pair+                  \ ~(x1, x2) -> case runCheck f1 x1 of+                                 Right y1       -> Right (y1, x2)+                                 Left  e        -> Left  e++    second f2   = C $                           -- check 2. component of a pair+                  \ ~(x1, x2) -> case runCheck f2 x2 of+                                 Right y2       -> Right (x1, y2)+                                 Left  e        -> Left  e++++instance ArrowZero CheckA where+    zeroArrow   = C $ const (Left "")           -- always false: zero++instance ArrowPlus CheckA where+    f1 <+> f2   = C $                           -- logical or+                  \ x -> case runCheck f1 x of+                         Right y1       -> Right y1+                         Left  e1       -> case runCheck f2 x of+                                           Right y2     -> Right y2+                                           Left  e2     -> Left ( if null e1+                                                                  then e2+                                                                  else+                                                                  if null e2+                                                                  then e1+                                                                  else e1 ++ " or " ++ e2+                                                                )++type CheckString        = CheckA String String+type CheckInteger       = CheckA Integer Integer++-- | run a check and deliver Just an error message or Nothing++performCheck    :: CheckA a b -> a -> Maybe String+performCheck c  = either Just (const Nothing) . runCheck c++-- | always failure++failure         :: (a -> String) -> CheckA a b+failure msg     = C (Left . msg)++-- | every thing is fine++ok              :: CheckA a a+ok              = arr id++-- | perform a simple check with a predicate p,+--   when the predicate holds, assert acts as identity,+--   else an error message is generated++assert  :: (a -> Bool) -> (a -> String) -> CheckA a a+assert p msg    = C $ \ x -> if p x then Right x else Left (msg x)++-- | perform a simple check with a Maybe function, Nothing indicates error++assertMaybe     :: (a -> Maybe b) -> (a -> String) -> CheckA a b+assertMaybe f msg+    = C $ \ x -> case f x of+                 Nothing        -> Left (msg x)+                 Just y         -> Right y++-- | perform a check, but convert the value before checking++checkWith       :: (a -> b) -> CheckA b c -> CheckA a a+checkWith f c   = C $+                  \ x -> case runCheck c (f x) of+                         Right _        -> Right x+                         Left  e        -> Left  e++-- ------------------------------------------------------------++-- RelaxNG attribute names++rng_length, rng_maxLength, rng_minLength+ ,rng_maxExclusive, rng_minExclusive, rng_maxInclusive, rng_minInclusive :: String++rng_length              = "length"+rng_maxLength           = "maxLength"+rng_minLength           = "minLength"++rng_maxExclusive        = "maxExclusive"+rng_minExclusive        = "minExclusive"+rng_maxInclusive        = "maxInclusive"+rng_minInclusive        = "minInclusive"++-- ------------------------------------------------------------++-- | Function table type++type FunctionTable      = [(String, String -> String -> Bool)]++-- | Function table for numeric tests,+-- XML document value is first operand, schema value second++fctTableNum :: (Ord a, Num a) => [(String, a -> a -> Bool)]+fctTableNum+    = [ (rng_maxExclusive, (<))+      , (rng_minExclusive, (>))+      , (rng_maxInclusive, (<=))+      , (rng_minInclusive, (>=))+      ]++-- | Function table for string tests,+-- XML document value is first operand, schema value second+fctTableString :: FunctionTable+fctTableString+    = [ (rng_length,    (numParamValid (==)))+      , (rng_maxLength, (numParamValid (<=)))+      , (rng_minLength, (numParamValid (>=)))+      ]++-- | Function table for list tests,+-- XML document value is first operand, schema value second++fctTableList :: FunctionTable+fctTableList+    = [ (rng_length,    (listParamValid (==)))+      , (rng_maxLength, (listParamValid (<=)))+      , (rng_minLength, (listParamValid (>=)))+      ]++{- |+tests whether a string value matches a numeric param++valid example:++> <data type="CHAR"> <param name="maxLength">5</param> </data>++invalid example:++> <data type="CHAR"> <param name="minLength">foo</param> </data>++-}++numParamValid :: (Integer -> Integer -> Bool) -> String -> String -> Bool+numParamValid fct a b+  = isNumber b+    &&+    ( toInteger (length a) `fct` (read b) )++{- |+tests whether a list value matches a length constraint++valid example:++> <data type="IDREFS"> <param name="maxLength">5</param> </data>++invalid example:++> <data type="IDREFS"> <param name="minLength">foo</param> </data>++-}++listParamValid :: (Integer -> Integer -> Bool) -> String -> String -> Bool+listParamValid fct a b+  = isNumber b+    &&+    ( toInteger (length . words $ a) `fct` (read b) )++-- ------------------------------------------------------------+-- new check functions++{- |+Tests whether a \"string\" datatype value is between the lower and+upper bound of the datatype and matches all parameters.++All tests are performed on the string value.++   * 1.parameter  :  datatype++   - 2.parameter  :  lower bound of the datatype range++   - 3.parameter  :  upper bound of the datatype range (-1 = no upper bound)++   - 4.parameter  :  list of parameters++   - 5.parameter  :  datatype value to be checked++   - return : Just \"Errormessage\" in case of an error, else Nothing++-}++stringValid     :: DatatypeName -> Integer -> Integer -> ParamList -> CheckString+stringValid     = stringValidFT fctTableString++stringValidFT :: FunctionTable -> DatatypeName -> Integer -> Integer -> ParamList -> CheckString+stringValidFT ft datatype lowerBound upperBound params+    = assert boundsOK boundsErr+      >>>+      paramsStringValid params+    where+    boundsOK v+        = ( (lowerBound == 0)+            ||+            (toInteger (length v) >= lowerBound)+          )+          &&+          ( (upperBound == (-1))+            ||+            (toInteger (length v) <= upperBound)+          )++    boundsErr v+        = "Length of " ++ v+          ++ " (" ++ (show $ length v) ++ " chars) out of range: "+          ++ show lowerBound ++ " .. " ++ show upperBound+          ++ " for datatype " ++ datatype++    paramStringValid :: (LocalName, String) -> CheckString+    paramStringValid (pn, pv)+        = assert paramOK (errorMsgParam pn pv)+          where+          paramOK v  = paramFct pn v pv+          paramFct n = fromMaybe (const . const $ True) $ lookup n ft++    paramsStringValid :: ParamList -> CheckString+    paramsStringValid+        = foldr (>>>) ok . map paramStringValid++-- ------------------------------------------------------------++{- |+Tests whether a \"numeric\" datatype value is between the lower and upper+bound of the datatype and matches all parameters.++First, the string value is parsed into a numeric representation.+If no error occur, all following tests are performed on the numeric value.++   * 1.parameter  :  datatype++   - 2.parameter  :  lower bound of the datatype range++   - 3.parameter  :  upper bound of the datatype range (-1 = no upper bound)++   - 4.parameter  :  list of parameters++   - 5.parameter  :  datatype value to be checked++   - return : Just \"Errormessage\" in case of an error, else Nothing++-}++numberValid :: DatatypeName -> Integer -> Integer -> ParamList -> CheckString+numberValid datatype lowerBound upperBound params+    = assert isNumber numErr+      >>>+      checkWith read ( assert inRange rangeErr+                       >>>+                       paramsNumValid params+                     )+    where+    inRange     :: Integer -> Bool+    inRange x   = x >= lowerBound+                  &&+                  x <= upperBound++    rangeErr v  = ( "Value = " ++ show v ++ " out of range: "+                    ++ show lowerBound ++ " .. " ++ show upperBound+                    ++ " for datatype " ++ datatype+                  )+    numErr v+        = "Value = " ++ v ++ " is not a number"++paramsNumValid  :: ParamList -> CheckInteger+paramsNumValid+    = foldr (>>>) ok . map paramNumValid++paramNumValid   :: (LocalName, String) -> CheckInteger+paramNumValid (pn, pv)+    = assert paramOK (errorMsgParam pn pv . show)+    where+    paramOK  v = isNumber pv+                 &&+                 paramFct pn v (read pv)+    paramFct n = fromJust $ lookup n fctTableNum++-- ------------------------------------------------------------++{- |+Error Message for the equality test of two datatype values++   * 1.parameter  :  datatype++   - 2.parameter  :  datatype value++   - 3.parameter  :  datatype value++example:++> errorMsgEqual "Int" "21" "42" -> "Datatype Int with value = 21 expected, but value = 42 found"++-}++errorMsgParam   :: LocalName -> String -> String -> String+errorMsgParam pn pv v+    = ( "Parameter restriction: \""+        ++ pn ++ " = " ++ pv+        ++ "\" does not hold for value = \"" ++ v ++ "\""+      )++errorMsgEqual :: DatatypeName -> String -> String -> String+errorMsgEqual d s1 s2+    = ( "Datatype" ++ show d +++        " with value = " ++ show s1 +++        " expected, but value = " ++ show s2 ++ " found"+      )+errorMsgDataTypeNotAllowed :: String -> String -> [(String, String)] -> String -> String+errorMsgDataTypeNotAllowed l t p v+    = ( "Datatype " ++ show t ++ " with parameter(s) " +++        formatStringListPairs p ++ " and value = " ++ show v +++        " not allowed for DatatypeLibrary " ++ show l+      )++errorMsgDataTypeNotAllowed0 :: String -> String -> String+errorMsgDataTypeNotAllowed0 l t+    = ( "Datatype " ++ show t +++        " not allowed for DatatypeLibrary " ++ show l+      )+errorMsgDataTypeNotAllowed2 :: String -> String -> String -> String -> String+errorMsgDataTypeNotAllowed2 l t v1 v2+    = ( "Datatype " ++ show t +++        " with values = " ++ show v1 +++        " and " ++ show v2 +++        " not allowed for DatatypeLibrary " ++ show l+      )++errorMsgDataLibQName :: String -> String -> String -> String+errorMsgDataLibQName l n v+    = show v ++ " is not a valid " ++ n ++ " for DatatypeLibrary " ++ l++-- ------------------------------------------------------------
+ src/Text/XML/HXT/RelaxNG/DataTypeLibraries.hs view
@@ -0,0 +1,140 @@+-- | This modul exports the list of supported datatype libraries.+-- It also exports the main functions to validate an XML instance value+-- with respect to a datatype.++module Text.XML.HXT.RelaxNG.DataTypeLibraries+  ( datatypeLibraries+  , datatypeEqual+  , datatypeAllows+  )+where++import Text.XML.HXT.DOM.Interface+    ( relaxNamespace+    )++import Text.XML.HXT.RelaxNG.DataTypeLibUtils++import Text.XML.HXT.RelaxNG.DataTypeLibMysql+    ( mysqlDatatypeLib )++import Text.XML.HXT.RelaxNG.XMLSchema.DataTypeLibW3C+    ( w3cDatatypeLib )++import Data.Maybe+    ( fromJust )++-- ------------------------------------------------------------+++-- | List of all supported datatype libraries which can be+-- used within the Relax NG validator modul.++datatypeLibraries :: DatatypeLibraries+datatypeLibraries+    = [ relaxDatatypeLib+      , relaxDatatypeLib'+      , mysqlDatatypeLib+      , w3cDatatypeLib+      ]+++{- |+Tests whether a XML instance value matches a value-pattern.++The following tests are performed:++   * 1. :  does the uri exist in the list of supported datatype libraries++   - 2. :  does the library support the datatype++   - 3. :  does the XML instance value match the value-pattern++The hard work is done by the specialized 'DatatypeEqual' function+(see also: 'DatatypeCheck') of the datatype library.+-}++datatypeEqual :: Uri -> DatatypeEqual+datatypeEqual uri d s1 c1 s2 c2+    = if elem uri (map fst datatypeLibraries)+      then dtEqFct d s1 c1 s2 c2+      else Just ( "Unknown DatatypeLibrary " ++ show uri )+    where+    DTC _ dtEqFct _ = fromJust $ lookup uri datatypeLibraries++{- |+Tests whether a XML instance value matches a data-pattern.++The following tests are performed:++   * 1. :  does the uri exist in the list of supported datatype libraries++   - 2. :  does the library support the datatype++   - 3. :  does the XML instance value match the data-pattern++   - 4. :  does the XML instance value match all params++The hard work is done by the specialized 'DatatypeAllows' function+(see also: 'DatatypeCheck') of the datatype library.++-}++datatypeAllows :: Uri -> DatatypeAllows+datatypeAllows uri d params s1 c1+    = if elem uri (map fst datatypeLibraries)+      then dtAllowFct d params s1 c1+      else Just ( "Unknown DatatypeLibrary " ++ show uri )+    where+    DTC dtAllowFct _ _ = fromJust $ lookup uri datatypeLibraries+++-- --------------------------------------------------------------------------------------+-- Relax NG build in datatype library++relaxDatatypeLib        :: DatatypeLibrary+relaxDatatypeLib        = (relaxNamespace, DTC datatypeAllowsRelax datatypeEqualRelax relaxDatatypes)++-- | if there is no datatype uri, the built in datatype library is used+relaxDatatypeLib'       :: DatatypeLibrary+relaxDatatypeLib'       = ("",             DTC datatypeAllowsRelax datatypeEqualRelax relaxDatatypes)++-- | The build in Relax NG datatype lib supportes only the token and string datatype,+-- without any params.++relaxDatatypes :: AllowedDatatypes+relaxDatatypes+    = map ( (\ x -> (x, [])) . fst ) relaxDatatypeTable++datatypeAllowsRelax :: DatatypeAllows+datatypeAllowsRelax d p v _+    = maybe notAllowed' allowed . lookup d $ relaxDatatypeTable+    where+    notAllowed'+        = Just $ errorMsgDataTypeNotAllowed relaxNamespace d p v+    allowed _+        = Nothing++-- | If the token datatype is used, the values have to be normalized+-- (trailing and leading whitespaces are removed).+-- token does not perform any changes to the values.++datatypeEqualRelax :: DatatypeEqual+datatypeEqualRelax d s1 _ s2 _+    = maybe notAllowed' checkValues . lookup d $ relaxDatatypeTable+      where+      notAllowed'+          = Just $ errorMsgDataTypeNotAllowed2 relaxNamespace d s1 s2+      checkValues predicate+          = if predicate s1 s2+            then Nothing+            else Just $ errorMsgEqual d s1 s2++relaxDatatypeTable :: [(String, String -> String -> Bool)]+relaxDatatypeTable+    = [ ("string", (==))+      , ("token",  \ s1 s2 -> normalizeWhitespace s1 == normalizeWhitespace s2 )+      ]+++-- --------------------------------------------------------------------------------------
+ src/Text/XML/HXT/RelaxNG/DataTypes.hs view
@@ -0,0 +1,298 @@+module Text.XML.HXT.RelaxNG.DataTypes+where++import Text.XML.HXT.DOM.TypeDefs++-- ------------------------------------------------------------++relaxSchemaFile :: String+relaxSchemaFile = "Text/XML/HXT/RelaxNG/SpecificationSchema.rng"+++relaxSchemaGrammarFile :: String+relaxSchemaGrammarFile = "Text/XML/HXT/RelaxNG/SpecificationSchemaGrammar.rng"++-- ------------------------------------------------------------+-- datatypes for the simplification process++a_numberOfErrors,+ a_relaxSimplificationChanges,+ a_output_changes,+ defineOrigName :: String++a_numberOfErrors             = "numberOfErrors"+a_relaxSimplificationChanges = "relaxSimplificationChanges"+a_output_changes             = "output-pattern-transformations"+defineOrigName               = "RelaxDefineOriginalName"+++type Env = [(String, XmlTree)]++-- | Start of a context attribute value+-- (see also: 'Text.XML.HXT.RelaxNG.Simplification.simplificationStep1')+--+-- The value is always followed by the original attribute name and value++contextAttributes :: String+contextAttributes = "RelaxContext:"+++-- | Start of base uri attribute value+-- (see also: 'simplificationStep1' in "Text.XML.HXT.RelaxNG.Simplification")++contextBaseAttr :: String+contextBaseAttr = "RelaxContextBaseURI"+++-- see simplificationStep5 in Text.XML.HXT.RelaxNG.Simplification++type OldName = String+type NewName = String+type NamePair = (OldName, NewName)+type RefList = [NamePair]+++-- ------------------------------------------------------------+-- datatype library handling++-- | Type of all datatype libraries functions that tests whether+-- a XML instance value matches a value-pattern.+--+-- Returns Just \"errorMessage\" in case of an error else Nothing.++type DatatypeEqual  = DatatypeName -> String -> Context -> String -> Context -> Maybe String+++-- | Type of all datatype libraries functions that tests whether+-- a XML instance value matches a data-pattern.+--+-- Returns Just \"errorMessage\" in case of an error else Nothing.++type DatatypeAllows = DatatypeName -> ParamList -> String -> Context -> Maybe String+++-- | List of all supported datatype libraries++type DatatypeLibraries = [DatatypeLibrary]+++-- | Each datatype library is identified by a URI.++type DatatypeLibrary   = (Uri, DatatypeCheck)++type DatatypeName      = String++type ParamName         = String+++-- | List of all supported params for a datatype++type AllowedParams     = [ParamName]+++-- | List of all supported datatypes and there allowed params++type AllowedDatatypes  = [(DatatypeName, AllowedParams)]+++-- | The Constructor exports the list of supported datatypes for a library.+-- It also exports the specialized datatype library functions to validate+-- a XML instance value with respect to a datatype.++data DatatypeCheck+  = DTC { dtAllowsFct    :: DatatypeAllows -- ^ function to test whether a value matches a data-pattern+        , dtEqualFct     :: DatatypeEqual -- ^ function to test whether a value matches a value-pattern+        , dtAllowedTypes :: AllowedDatatypes -- ^ list of all supported params for a datatype+        }++-- ------------------------------------------------------------+-- datatypes for the validation process++type Uri = String++type LocalName = String+++-- | List of parameters; each parameter is a pair consisting of a local name and a value.++type ParamList = [(LocalName, String)]++type Prefix = String+++-- | A Context represents the context of an XML element.+-- It consists of a base URI and a mapping from prefixes to namespace URIs.++type Context = (Uri, [(Prefix, Uri)])++-- | A Datatype identifies a datatype by a datatype library name and a local name.++type Datatype = (Uri, LocalName)++showDatatype    :: Datatype -> String+showDatatype (u, ln)+         | null u       = ln+         | otherwise    = "{" ++ u ++ "}" ++ ln++-- | Represents a name class++data NameClass = AnyName+               | AnyNameExcept NameClass+               | Name Uri LocalName+               | NsName Uri+               | NsNameExcept Uri NameClass+               | NameClassChoice NameClass NameClass+               | NCError String+               deriving Eq++instance Show NameClass+    where+    show AnyName        = "AnyName"+    show (AnyNameExcept nameClass)+                        = "AnyNameExcept: " ++ show nameClass+    show (Name uri localName)+        | null uri      = localName+        | otherwise     = "{" ++ uri ++ "}" ++ localName+    show (NsName uri)   = "{" ++ uri ++ "}AnyName"+    show (NsNameExcept uri nameClass)+                        = "NsNameExcept: {" ++ uri ++ "}" ++ show nameClass+    show (NameClassChoice nameClass1 nameClass2)+                        = "NameClassChoice: " ++ show nameClass1 ++ "|" ++ show nameClass2+    show (NCError string)+                         = "NCError: " ++ string+++-- | Represents a pattern after simplification++data Pattern = Empty+             | NotAllowed ErrMessage+             | Text+             | Choice Pattern Pattern+             | Interleave Pattern Pattern+             | Group Pattern Pattern+             | OneOrMore Pattern+             | List Pattern+             | Data Datatype ParamList+             | DataExcept Datatype ParamList Pattern+             | Value Datatype String Context+             | Attribute NameClass Pattern+             | Element NameClass Pattern+             | After Pattern Pattern++instance Show Pattern where+    show Empty                  = "empty"+    show (NotAllowed e)         = show e+    show Text                   = "text"+    show (Choice p1 p2)         = "( " ++ show p1 ++ " | " ++ show p2 ++ " )"+    show (Interleave p1 p2)     = "( " ++ show p1 ++ " & " ++ show p2 ++ " )"+    show (Group p1 p2)          = "( " ++ show p1 ++ " , " ++ show p2 ++ " )"+    show (OneOrMore p)          = show p ++ "+"+    show (List p)               = "list { " ++ show p ++ " }"+    show (Data dt pl)           = showDatatype dt ++ showPL pl+                                  where+                                  showPL []     = ""+                                  showPL l      = " {" ++ concatMap showP l ++ " }"+                                  showP (ln, v) = " " ++ ln ++ " = " ++ show v+    show (DataExcept dt pl p)   = show (Data dt pl) ++ " - (" ++ show p ++ " )"+    show (Value dt v _cx)       = showDatatype dt ++ " " ++ show v+    show (Attribute nc p)       = "attribute " ++ show nc ++ " { " ++ show p ++ " }"+    show (Element nc p)         = "element "   ++ show nc ++ " { " ++ show p ++ " }"+    show (After p1 p2)          =  "( " ++ show p1 ++ " ; " ++ show p2 ++ " )"++data ErrMessage = ErrMsg ErrLevel [String]+                  -- deriving Show++instance Show ErrMessage where+    show (ErrMsg _lev es) = foldr1 (\ x y -> x ++ "\n" ++ y) es++type ErrLevel   = Int++-- ------------------------------------------------------------++-- smart constructor funtions for Pattern++-- | smart constructor for NotAllowed++notAllowed      :: String -> Pattern+notAllowed      = notAllowedN 0++notAllowed1     :: String -> Pattern+notAllowed1     = notAllowedN 1++notAllowed2     :: String -> Pattern+notAllowed2     = notAllowedN 2++notAllowedN     :: ErrLevel -> String -> Pattern+notAllowedN l s = NotAllowed (ErrMsg l [s])++-- | merge error messages+--+-- If error levels are different, the more important is taken,+-- if level is 2 (max level) both error messages are taken+-- else the 1. error mesage is taken++mergeNotAllowed :: Pattern -> Pattern -> Pattern+mergeNotAllowed p1@(NotAllowed (ErrMsg l1 s1)) p2@(NotAllowed (ErrMsg l2 s2))+    | l1 < l2   = p2+    | l1 > l2   = p1+    | l1 == 2   = NotAllowed $ ErrMsg 2 (s1 ++ s2)+    | otherwise = p1++-- TODO : weird error when collecting error messages errors are duplicated++mergeNotAllowed _p1 _p2+    = notAllowed2 "mergeNotAllowed with wrong patterns"++-- | smart constructor for Choice++choice :: Pattern -> Pattern -> Pattern+choice p1@(NotAllowed _) p2@(NotAllowed _)      = mergeNotAllowed p1 p2+choice p1                   (NotAllowed _)      = p1+choice (NotAllowed _)    p2                     = p2+choice p1                p2                     = Choice p1 p2++-- | smart constructor for Group++group :: Pattern -> Pattern -> Pattern+group p1@(NotAllowed _)  p2@(NotAllowed _)      = mergeNotAllowed p1 p2+group _                   n@(NotAllowed _)      = n+group   n@(NotAllowed _)  _                     = n+group p                  Empty                  = p+group Empty              p                      = p+group p1                 p2                     = Group p1 p2++-- | smart constructor for OneOrMore++oneOrMore :: Pattern -> Pattern+oneOrMore n@(NotAllowed _) = n+oneOrMore p                = OneOrMore p++-- | smart constructor for Interleave++interleave :: Pattern -> Pattern -> Pattern+interleave p1@(NotAllowed _) p2@(NotAllowed _)  = mergeNotAllowed p1 p2+interleave _                 p2@(NotAllowed _)  = p2+interleave p1@(NotAllowed _) _                  = p1+interleave p1                Empty              = p1+interleave Empty             p2                 = p2+interleave p1                p2                 = Interleave p1 p2++-- | smart constructor for After++after :: Pattern -> Pattern -> Pattern+after p1@(NotAllowed _) p2@(NotAllowed _)       = mergeNotAllowed p1 p2+after _                 p2@(NotAllowed _)       = p2+after p1@(NotAllowed _) _                       = p1+after p1                p2                      = After p1 p2+++-- | Possible content types of a Relax NG pattern.+-- (see also chapter 7.2 in Relax NG specification)++data ContentType = CTEmpty+                 | CTComplex+                 | CTSimple+                 | CTNone+     deriving (Show, Eq, Ord)++-- ------------------------------------------------------------
+ src/Text/XML/HXT/RelaxNG/PatternFunctions.hs view
@@ -0,0 +1,108 @@+-- | basic 'Pattern' functions+--++module Text.XML.HXT.RelaxNG.PatternFunctions++where++import Text.XML.HXT.RelaxNG.DataTypes+++-- ------------------------------------------------------------++isRelaxEmpty :: Pattern -> Bool+isRelaxEmpty Empty = True+isRelaxEmpty _     = False++isRelaxNotAllowed :: Pattern -> Bool+isRelaxNotAllowed (NotAllowed _) = True+isRelaxNotAllowed _              = False++isRelaxText :: Pattern -> Bool+isRelaxText Text = True+isRelaxText _    = False++isRelaxChoice :: Pattern -> Bool+isRelaxChoice (Choice _ _) = True+isRelaxChoice _            = False++isRelaxInterleave :: Pattern -> Bool+isRelaxInterleave (Interleave _ _) = True+isRelaxInterleave _                = False++isRelaxGroup :: Pattern -> Bool+isRelaxGroup (Group _ _) = True+isRelaxGroup _           = False++isRelaxOneOrMore :: Pattern -> Bool+isRelaxOneOrMore (OneOrMore _) = True+isRelaxOneOrMore _             = False++isRelaxList :: Pattern -> Bool+isRelaxList (List _) = True+isRelaxList _        = False++isRelaxData :: Pattern -> Bool+isRelaxData (Data _ _) = True+isRelaxData _          = False++isRelaxDataExcept :: Pattern -> Bool+isRelaxDataExcept (DataExcept _ _ _) = True+isRelaxDataExcept _                  = False++isRelaxValue :: Pattern -> Bool+isRelaxValue (Value _ _ _) = True+isRelaxValue _             = False++isRelaxAttribute :: Pattern -> Bool+isRelaxAttribute (Attribute _ _) = True+isRelaxAttribute _               = False++isRelaxElement :: Pattern -> Bool+isRelaxElement (Element _ _) = True+isRelaxElement _             = False++isRelaxAfter :: Pattern -> Bool+isRelaxAfter (After _ _) = True+isRelaxAfter _           = False+++-- | Returns a list of children pattern for each pattern,+-- e.g. (Choice p1 p2) = [p1, p2]+getChildrenPattern :: Pattern -> [Pattern]+getChildrenPattern (Choice p1 p2) = [p1, p2]+getChildrenPattern (Interleave p1 p2) = [p1, p2]+getChildrenPattern (Group p1 p2) = [p1, p2]+getChildrenPattern (OneOrMore p) = [p]+getChildrenPattern (List p) = [p]+getChildrenPattern (Element _ p) = [p]+getChildrenPattern (DataExcept _ _ p) = [p]+getChildrenPattern (Attribute _ p) = [p]+getChildrenPattern (After p1 p2) = [p1, p2]+getChildrenPattern _ = []+++-- | Returns the nameclass of a element- or attribute pattern.+-- Otherwise 'NCError' is returned.+getNameClassFromPattern :: Pattern -> NameClass+getNameClassFromPattern (Element nc _) = nc+getNameClassFromPattern (Attribute nc _) = nc+getNameClassFromPattern _ = NCError "Pattern without a NameClass"+++-- | Returns a string representation of the pattern name+getPatternName :: Pattern -> String+getPatternName (Empty) = "Empty"+getPatternName (NotAllowed _) = "NotAllowed"+getPatternName (Text) = "Text"+getPatternName (Choice _ _) = "Choice"+getPatternName (Interleave _ _) = "Interleave"+getPatternName (Group _ _) = "Group"+getPatternName (OneOrMore _) = "OneOrMore"+getPatternName (List _) = "List"+getPatternName (Data _ _ ) = "Data"+getPatternName (DataExcept _ _ _) = "DataExcept"+getPatternName (Value _ _ _) = "Value"+getPatternName (Attribute _ _) = "Attribute"+getPatternName (Element _ _) = "Element"+getPatternName (After _ _) = "After"
+ src/Text/XML/HXT/RelaxNG/PatternToString.hs view
@@ -0,0 +1,360 @@+module Text.XML.HXT.RelaxNG.PatternToString+  ( patternToStringTree+  , patternToFormatedString+  , xmlTreeToPatternStringTree+  , xmlTreeToPatternFormatedString+  , xmlTreeToPatternString+  , nameClassToString+  )+where++import Control.Arrow.ListArrows++import Data.Tree.NTree.TypeDefs++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.RelaxNG.DataTypes+import Text.XML.HXT.RelaxNG.CreatePattern+import Text.XML.HXT.RelaxNG.Utils++-- ------------------------------------------------------------++type PatternTree = NTree String+++{- |+Returns a string representation of the pattern structure.+(see also: 'createPatternFromXmlTree')++Example:++> Element {}foo (Choice (Choice (Value ("","token") "abc"+> ("foo","www.bar.baz")]))(Data ("http://www.mysql.com","VARCHAR")+> [("length","2"),("maxLength","5")])) (Element {}bar (Group (Element {}baz++The function can @not@ be used to display circular ref-pattern structures.+-}++xmlTreeToPatternString :: LA XmlTree String+xmlTreeToPatternString+    = createPatternFromXmlTree+      >>^+      show+++-- | Returns a string representation of a nameclass.++nameClassToString :: NameClass -> String+nameClassToString AnyName+    = "AnyName"++nameClassToString (AnyNameExcept nc)+    = "AnyNameExcept " ++ nameClassToString nc++nameClassToString (Name uri local)+    = "{" ++ uri ++ "}" ++ local++nameClassToString (NsName uri)+    = "{" ++ uri ++ "}"++nameClassToString (NsNameExcept uri nc)+    = uri ++ "except (NsName) " ++ nameClassToString nc++nameClassToString (NameClassChoice nc1 nc2)+    = nameClassToString nc1 ++ " " ++ nameClassToString nc2++nameClassToString (NCError e)+    = "NameClass Error: " ++ e+++-- ------------------------------------------------------------++{- |+Returns a tree representation of the pattern structure.+The hard work is done by 'formatTree'.++Example:++> +---element {}bar+>     |+>     +---group+>         |+>         +---oneOrMore+>         |   |+>         |   +---attribute AnyName+>         |       |+>         |       +---text+>         |+>         +---text++The function can be used to display circular ref-pattern structures.++Example:++> <define name="baz">+>   <element name="baz">+>     ... <ref name="baz"/> ...+>   </element>+> </define>++-}++patternToStringTree :: LA Pattern String+patternToStringTree+    = fromSLA [] pattern2PatternTree+      >>^+      (\p -> formatTree id p ++ "\n")+++-- | Returns a tree representation of the pattern structure.+-- (see also: 'createPatternFromXmlTree' and 'patternToStringTree')++xmlTreeToPatternStringTree :: LA XmlTree String+xmlTreeToPatternStringTree+    = createPatternFromXmlTree+      >>>+      patternToStringTree+++pattern2PatternTree :: SLA [NameClass] Pattern PatternTree+pattern2PatternTree+    = choiceA+      [ isA isRelaxEmpty      :-> (constA $ NTree "empty" [])+      , isA isRelaxNotAllowed :-> notAllowed2PatternTree+      , isA isRelaxText       :-> (constA $ NTree "text" [])+      , isA isRelaxChoice     :-> choice2PatternTree+      , isA isRelaxInterleave :-> children2PatternTree "interleave"+      , isA isRelaxGroup      :-> children2PatternTree "group"+      , isA isRelaxOneOrMore  :-> children2PatternTree "oneOrMore"+      , isA isRelaxList       :-> children2PatternTree "list"+      , isA isRelaxData       :-> data2PatternTree+      , isA isRelaxDataExcept :-> dataExcept2PatternTree+      , isA isRelaxValue      :-> value2PatternTree+      , isA isRelaxAttribute  :-> createPatternTreeFromElement "attribute"+      , isA isRelaxElement    :-> element2PatternTree+      , isA isRelaxAfter      :-> children2PatternTree "after"+      ]++notAllowed2PatternTree :: SLA [NameClass] Pattern PatternTree+notAllowed2PatternTree+    = arr $ \(NotAllowed (ErrMsg _l sl)) -> NTree "notAllowed" $ map (\ s -> NTree s []) sl+++data2PatternTree :: SLA [NameClass] Pattern PatternTree+data2PatternTree+    = arr $ \ (Data d p) -> NTree "data" [ datatype2PatternTree d+                                         , mapping2PatternTree "parameter" p+                                         ]++dataExcept2PatternTree :: SLA [NameClass] Pattern PatternTree+dataExcept2PatternTree+    = this &&& (listA $ arrL getChildrenPattern >>> pattern2PatternTree)+      >>>+      arr2 ( \ (DataExcept d param _) pattern ->+             NTree "dataExcept" ([ datatype2PatternTree d+                                 , mapping2PatternTree "parameter" param+                                 ] ++ pattern)+           )++value2PatternTree :: SLA [NameClass] Pattern PatternTree+value2PatternTree+    = arr $ \ (Value d v c) -> NTree ("value = " ++ v) [ datatype2PatternTree d+                                                       , context2PatternTree c+                                                       ]+++createPatternTreeFromElement :: String -> SLA [NameClass] Pattern PatternTree+createPatternTreeFromElement name+    = ( arr getNameClassFromPattern+        &&&+        listA (arrL getChildrenPattern >>> pattern2PatternTree)+      )+      >>>+      arr2 (\nc rl -> NTree (name ++ " " ++ show nc) rl)++children2PatternTree :: String -> SLA [NameClass] Pattern PatternTree+children2PatternTree name+    = listA (arrL getChildrenPattern >>> pattern2PatternTree)+      >>^+      (NTree name)++choice2PatternTree :: SLA [NameClass] Pattern PatternTree+choice2PatternTree+    = ifA ( -- wenn das zweite kind ein noch nicht ausgegebenes element ist,+            -- muss dieses anders behandelt werden+            -- nur fuer bessere formatierung des outputs+            arr (last . getChildrenPattern) >>> isA (isRelaxElement) >>>+            (arr getNameClassFromPattern &&& getState) >>>+            isA(\ (nc, liste) -> not $ elem nc liste)+          )+      ( -- element in status aufnehmen, wird dann nicht mehr vom erste kind ausgegeben+        arr getChildrenPattern+        >>>+        changeState (\s p -> (getNameClassFromPattern (last p)) : s)+        >>>+        ( ( head ^>> pattern2PatternTree )              -- erstes kind normal verarbeiten+          &&&                                           -- zweites kind, das element, verarbeiten+          ( last ^>> createPatternTreeFromElement "element" )+        )+        >>>+        arr2 ( \ l1 l2 -> NTree "choice" [l1, l2] )+      )+      ( children2PatternTree "choice" )+++element2PatternTree :: SLA [NameClass] Pattern PatternTree+element2PatternTree+    = ifA ( (arr getNameClassFromPattern &&& getState)+            >>>+            isA (\ (nc, liste) -> elem nc liste)+          )+      ( arr getNameClassFromPattern+        >>>+        arr (\nc -> NTree ("reference to element " ++ show nc) [])+      )+      ( changeState (\ s p -> (getNameClassFromPattern p) : s)+        >>>+        createPatternTreeFromElement "element"+      )+++mapping2PatternTree :: String -> [(Prefix, Uri)] -> PatternTree+mapping2PatternTree name mapping+    = NTree name (map (\(a, b) -> NTree (a ++ " = " ++ b) []) mapping)+++datatype2PatternTree :: Datatype -> PatternTree+datatype2PatternTree dt+    = NTree (datatype2String dt) []+++context2PatternTree :: Context -> PatternTree+context2PatternTree (base, mapping)+    = NTree "context" [ NTree ("base-uri = " ++ base) []+                      , mapping2PatternTree "namespace environment" mapping+                      ]++-- ------------------------------------------------------------++-- | Returns a formated string representation of the pattern structure.+-- (see also: 'createPatternFromXmlTree' and 'patternToFormatedString')+xmlTreeToPatternFormatedString :: LA XmlTree String+xmlTreeToPatternFormatedString+    = createPatternFromXmlTree+      >>>+      fromSLA [] patternToFormatedString+++{- |+Returns a formated string representation of the pattern structure.++Example:++> Element {}foo (Choice (Choice ( Value = abc,+> datatypelibrary = http://relaxng.org/ns/structure/1.0, type = token,+> context (base-uri =file://test.rng,+> parameter: xml = http://www.w3.org/XML/1998/namespaces, foo = www.bar.baz),++The function can be used to display circular ref-pattern structures.+-}++patternToFormatedString :: SLA [NameClass] Pattern String+patternToFormatedString+    = choiceA+      [ isA isRelaxEmpty      :-> (constA " empty ")+      , isA isRelaxNotAllowed :-> (arr $ \ (NotAllowed errorEnv) -> show errorEnv)+      , isA isRelaxText       :-> (constA " text ")+      , isA isRelaxChoice     :-> children2FormatedString "choice"+      , isA isRelaxInterleave :-> children2FormatedString "interleave"+      , isA isRelaxGroup      :-> children2FormatedString "group"+      , isA isRelaxOneOrMore  :-> children2FormatedString "oneOrMore"+      , isA isRelaxList       :-> children2FormatedString "list"+      , isA isRelaxData       :-> data2FormatedString+      , isA isRelaxDataExcept :-> dataExcept2FormatedString+      , isA isRelaxValue      :-> value2FormatedString+      , isA isRelaxAttribute  :-> createFormatedStringFromElement "attribute"+      , isA isRelaxElement    :-> element2FormatedString+      , isA isRelaxAfter      :-> children2FormatedString "after"+      ]++children2FormatedString :: String -> SLA [NameClass] Pattern String+children2FormatedString name+    = listA (arrL getChildrenPattern >>> patternToFormatedString)+      >>^+      (\ l -> name ++ " (" ++ formatStringListPatt l ++ ") " )++data2FormatedString :: SLA [NameClass] Pattern String+data2FormatedString+    = arr ( \ (Data datatype paramList) ->+            "Data " ++ datatype2String datatype ++ "\n " +++            mapping2String "parameter" paramList ++ "\n"+          )++dataExcept2FormatedString :: SLA [NameClass] Pattern String+dataExcept2FormatedString+ = arr ( \ (DataExcept datatype paramList _) ->+         "DataExcept " ++ show datatype ++ "\n " +++         mapping2String "parameter" paramList ++ "\n "+       )+   &&&+   ( arr (\ (DataExcept _ _ p) -> p) >>> patternToFormatedString )+   >>>+   arr2 (++)+++value2FormatedString :: SLA [NameClass] Pattern String+value2FormatedString+ = arr $ \(Value datatype val context) ->+           "Value = " ++ val ++ ", " ++ datatype2String datatype +++           "\n " ++ context2String context ++ "\n"+++element2FormatedString :: SLA [NameClass] Pattern String+element2FormatedString+    = ifA ( (arr getNameClassFromPattern &&& getState)+            >>>+            isA (\ (nc, liste) -> elem nc liste)+          )+      ( arr getNameClassFromPattern+        >>^+        ( \nc -> "reference to element " ++ nameClassToString nc ++ " " )+      )+      ( changeState (\ s p -> (getNameClassFromPattern p) : s)+        >>>+        createFormatedStringFromElement "element"+      )+++createFormatedStringFromElement :: String -> SLA [NameClass] Pattern String+createFormatedStringFromElement name+    = ( arr getNameClassFromPattern+        &&&+        ( listA (arrL getChildrenPattern >>> patternToFormatedString)+          >>^+          formatStringListId+        )+      )+      >>>+      arr2 (\ nc rl -> name ++ " " ++ nameClassToString nc ++ " (" ++ rl ++ ")")+++-- ------------------------------------------------------------++mapping2String :: String -> [(Prefix, Uri)] -> String+mapping2String name mapping+    = name ++ ": " +++      formatStringList id ", " (map (\(a, b) -> a ++ " = " ++ b) mapping)++datatype2String :: Datatype -> String+datatype2String (lib, localName)+    = "datatypelibrary = " ++ getLib ++ ", type = " ++ localName+    where+    getLib = if lib == "" then relaxNamespace else lib++context2String :: Context -> String+context2String (base, mapping)+    = "context (base-uri = " ++ base ++ ", " +++      mapping2String "namespace environment" mapping ++ ")"++-- ------------------------------------------------------------
+ src/Text/XML/HXT/RelaxNG/Schema.hs view
@@ -0,0 +1,3921 @@+{- |+   Module     : Text.HXT.RelaxNG.Schema++   Don't edit this module, it's generated by RelaxSchemaToXmlTree++-}++module Text.XML.HXT.RelaxNG.Schema+    ( relaxSchemaTree, relaxSchemaArrow )+where++import Text.XML.HXT.DOM.TypeDefs+import Text.XML.HXT.DOM.XmlNode (mkRoot, mkElement, mkAttr, mkText)++import Control.Arrow.ListArrows++relaxSchemaArrow :: ArrowList a => a b XmlTree+relaxSchemaArrow = constA relaxSchemaTree++relaxSchemaTree :: XmlTree+relaxSchemaTree =+  let+  ns1   = "http://relaxng.org/ns/structure/1.0"+  qn1   = mkSNsName "RelaxContext:xml"+  qn2   = mkSNsName "RelaxContextBaseURI"+  qn3   = mkSNsName "RelaxContextDefault"+  qn4   = mkNsName "anyName" ns1+  qn5   = mkNsName "attribute" ns1+  qn6   = mkNsName "choice" ns1+  qn7   = mkNsName "data" ns1+  qn8   = mkSNsName "datatypeLibrary"+  qn9   = mkNsName "define" ns1+  qn10  = mkNsName "element" ns1+  qn11  = mkNsName "empty" ns1+  qn12  = mkNsName "except" ns1+  qn13  = mkNsName "grammar" ns1+  qn14  = mkNsName "group" ns1+  qn15  = mkNsName "interleave" ns1+  qn16  = mkSNsName "name"+  qn17  = mkNsName "name" ns1+  qn18  = mkSNsName "ns"+  qn19  = mkNsName "nsName" ns1+  qn20  = mkNsName "oneOrMore" ns1+  qn21  = mkNsName "ref" ns1+  qn22  = mkNsName "start" ns1+  qn23  = mkNsName "text" ns1+  qn24  = mkSNsName "type"+  qn25  = mkNsName "value" ns1+  in+  mkRoot []+    [ mkElement qn13 []+      [ mkElement qn22 []+        [ mkElement qn6 []+          [ mkElement qn6 []+            [ mkElement qn6 []+              [ mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn21+                                              [ mkAttr qn16 [ mkText "24" ]+                                              ] []+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "25" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "26" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "27" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "28" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "29" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "30" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "31" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "32" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "33" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "34" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "35" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "36" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "37" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "38" ]+                    ] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "39" ]+                  ] []+                ]+              , mkElement qn21+                [ mkAttr qn16 [ mkText "42" ]+                ] []+              ]+            , mkElement qn21+              [ mkAttr qn16 [ mkText "43" ]+              ] []+            ]+          , mkElement qn21+            [ mkAttr qn16 [ mkText "44" ]+            ] []+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "44" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "grammar"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn21+                          [ mkAttr qn16 [ mkText "11" ]+                          ] []+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "10" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "22" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "23" ]+                      ] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "43" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "externalRef"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn5 []+                [ mkElement qn17+                  [ mkAttr qn18 [ mkText "" ]+                  ]+                  [ mkText "href"+                  ]+                , mkElement qn7+                  [ mkAttr qn24 [ mkText "anyURI" ]+                  , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                  ] []+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "15" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "42" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "notAllowed"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "15" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "39" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "data"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn5 []+                [ mkElement qn17+                  [ mkAttr qn18 [ mkText "" ]+                  ]+                  [ mkText "type"+                  ]+                , mkElement qn7+                  [ mkAttr qn24 [ mkText "NCName" ]+                  , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                  ] []+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn21+                      [ mkAttr qn16 [ mkText "40" ]+                      ] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "41" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "41" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "except"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "40" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "param"+            ]+          , mkElement qn14 []+            [ mkElement qn5 []+              [ mkElement qn17+                [ mkAttr qn18 [ mkText "" ]+                ]+                [ mkText "name"+                ]+              , mkElement qn7+                [ mkAttr qn24 [ mkText "NCName" ]+                , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                ] []+              ]+            , mkElement qn23 [] []+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "38" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "value"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "type"+                    ]+                  , mkElement qn7+                    [ mkAttr qn24 [ mkText "NCName" ]+                    , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                    ] []+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn23 [] []+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "37" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "text"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "15" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "36" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "empty"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "15" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "35" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "parentRef"+            ]+          , mkElement qn14 []+            [ mkElement qn5 []+              [ mkElement qn17+                [ mkAttr qn18 [ mkText "" ]+                ]+                [ mkText "name"+                ]+              , mkElement qn7+                [ mkAttr qn24 [ mkText "NCName" ]+                , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                ] []+              ]+            , mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "34" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "ref"+            ]+          , mkElement qn14 []+            [ mkElement qn5 []+              [ mkElement qn17+                [ mkAttr qn18 [ mkText "" ]+                ]+                [ mkText "name"+                ]+              , mkElement qn7+                [ mkAttr qn24 [ mkText "NCName" ]+                , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                ] []+              ]+            , mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "33" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "mixed"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "32" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "list"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "31" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "oneOrMore"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "30" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "zeroOrMore"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "29" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "optional"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "28" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "choice"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "27" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "interleave"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "26" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "group"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "25" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "attribute"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "name"+                    ]+                  , mkElement qn7+                    [ mkAttr qn24 [ mkText "QName" ]+                    , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                    ] []+                  ]+                , mkElement qn15 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn20 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "15" ]+                        ] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn21+                          [ mkAttr qn16 [ mkText "17" ]+                          ] []+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "18" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "19" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "20" ]+                      ] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "24" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "element"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn6 []+                [ mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "name"+                    ]+                  , mkElement qn7+                    [ mkAttr qn24 [ mkText "QName" ]+                    , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                    ] []+                  ]+                , mkElement qn15 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn20 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "15" ]+                        ] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn21+                          [ mkAttr qn16 [ mkText "17" ]+                          ] []+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "18" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "19" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "20" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "23" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "include"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn5 []+                [ mkElement qn17+                  [ mkAttr qn18 [ mkText "" ]+                  ]+                  [ mkText "href"+                  ]+                , mkElement qn7+                  [ mkAttr qn24 [ mkText "anyURI" ]+                  , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                  ] []+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "11" ]+                        ] []+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "10" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "21" ]+                      ] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "22" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "div"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn21+                          [ mkAttr qn16 [ mkText "11" ]+                          ] []+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "10" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "22" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "23" ]+                      ] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "21" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "div"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "11" ]+                        ] []+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "10" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "21" ]+                      ] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "20" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "choice"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "17" ]+                        ] []+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "18" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "19" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "20" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "19" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "nsName"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "16" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "18" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "anyName"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "16" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "17" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "name"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn7+              [ mkAttr qn24 [ mkText "QName" ]+              , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+              ] []+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "16" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "except"+            ]+          , mkElement qn15 []+            [ mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "15" ]+                  ] []+                ]+              ]+            , mkElement qn20 []+              [ mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn21+                      [ mkAttr qn16 [ mkText "17" ]+                      ] []+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "18" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "19" ]+                    ] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "20" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "15" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn4 []+            [ mkElement qn12 []+              [ mkElement qn19+                [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                ] []+              ]+            ]+          , mkElement qn6 []+            [ mkElement qn11 [] []+            , mkElement qn20 []+              [ mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn5 []+                    [ mkElement qn4 [] []+                    , mkElement qn23 [] []+                    ]+                  , mkElement qn23 [] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "0" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "0" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn4 [] []+          , mkElement qn6 []+            [ mkElement qn11 [] []+            , mkElement qn20 []+              [ mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn5 []+                    [ mkElement qn4 [] []+                    , mkElement qn23 [] []+                    ]+                  , mkElement qn23 [] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "0" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "10" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "define"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "name"+                    ]+                  , mkElement qn7+                    [ mkAttr qn24 [ mkText "NCName" ]+                    , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                    ] []+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "combine"+                      ]+                    , mkElement qn6 []+                      [ mkElement qn25+                        [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]+                        , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                        , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/Schema.rng" ]+                        , mkAttr qn8 [ mkText "" ]+                        , mkAttr qn24 [ mkText "token" ]+                        , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                        ]+                        [ mkText "choice"+                        ]+                      , mkElement qn25+                        [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]+                        , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                        , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/Schema.rng" ]+                        , mkAttr qn8 [ mkText "" ]+                        , mkAttr qn24 [ mkText "token" ]+                        , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                        ]+                        [ mkText "interleave"+                        ]+                      ]+                    ]+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "24" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "42" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "11" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "start"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "combine"+                    ]+                  , mkElement qn6 []+                    [ mkElement qn25+                      [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]+                      , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                      , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/Schema.rng" ]+                      , mkAttr qn8 [ mkText "" ]+                      , mkAttr qn24 [ mkText "token" ]+                      , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                      ]+                      [ mkText "choice"+                      ]+                    , mkElement qn25+                      [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]+                      , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                      , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/Schema.rng" ]+                      , mkAttr qn8 [ mkText "" ]+                      , mkAttr qn24 [ mkText "token" ]+                      , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                      ]+                      [ mkText "interleave"+                      ]+                    ]+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "15" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn21+                                                    [ mkAttr qn16 [ mkText "24" ]+                                                    ] []+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "25" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "26" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "27" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "28" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "29" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "30" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "31" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "32" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "33" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "34" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "35" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "36" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "37" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "38" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "39" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "42" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "43" ]+                    ] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "44" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      ]+    ]
+ src/Text/XML/HXT/RelaxNG/SchemaGrammar.hs view
@@ -0,0 +1,3831 @@+{- |+   Module     : Text.HXT.RelaxNG.SchemaGrammar++   Don't edit this module, it's generated by RelaxSchemaToXmlTree++-}++module Text.XML.HXT.RelaxNG.SchemaGrammar+    ( relaxSchemaTree, relaxSchemaArrow )+where++import Text.XML.HXT.DOM.TypeDefs+import Text.XML.HXT.DOM.XmlNode (mkRoot, mkElement, mkAttr, mkText)++import Control.Arrow.ListArrows++relaxSchemaArrow :: ArrowList a => a b XmlTree+relaxSchemaArrow = constA relaxSchemaTree++relaxSchemaTree :: XmlTree+relaxSchemaTree =+  let+  ns1   = "http://relaxng.org/ns/structure/1.0"+  qn1   = mkSNsName "RelaxContext:xml"+  qn2   = mkSNsName "RelaxContextBaseURI"+  qn3   = mkSNsName "RelaxContextDefault"+  qn4   = mkNsName "anyName" ns1+  qn5   = mkNsName "attribute" ns1+  qn6   = mkNsName "choice" ns1+  qn7   = mkNsName "data" ns1+  qn8   = mkSNsName "datatypeLibrary"+  qn9   = mkNsName "define" ns1+  qn10  = mkNsName "element" ns1+  qn11  = mkNsName "empty" ns1+  qn12  = mkNsName "except" ns1+  qn13  = mkNsName "grammar" ns1+  qn14  = mkNsName "group" ns1+  qn15  = mkNsName "interleave" ns1+  qn16  = mkSNsName "name"+  qn17  = mkNsName "name" ns1+  qn18  = mkSNsName "ns"+  qn19  = mkNsName "nsName" ns1+  qn20  = mkNsName "oneOrMore" ns1+  qn21  = mkNsName "ref" ns1+  qn22  = mkNsName "start" ns1+  qn23  = mkNsName "text" ns1+  qn24  = mkSNsName "type"+  qn25  = mkNsName "value" ns1+  in+  mkRoot []+    [ mkElement qn13 []+      [ mkElement qn22 []+        [ mkElement qn21+          [ mkAttr qn16 [ mkText "14" ]+          ] []+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "44" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "externalRef"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn5 []+                [ mkElement qn17+                  [ mkAttr qn18 [ mkText "" ]+                  ]+                  [ mkText "href"+                  ]+                , mkElement qn7+                  [ mkAttr qn24 [ mkText "anyURI" ]+                  , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                  ] []+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "16" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "43" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "notAllowed"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "16" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "40" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "data"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn5 []+                [ mkElement qn17+                  [ mkAttr qn18 [ mkText "" ]+                  ]+                  [ mkText "type"+                  ]+                , mkElement qn7+                  [ mkAttr qn24 [ mkText "NCName" ]+                  , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                  ] []+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn21+                      [ mkAttr qn16 [ mkText "41" ]+                      ] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "42" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "42" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "except"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "41" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "param"+            ]+          , mkElement qn14 []+            [ mkElement qn5 []+              [ mkElement qn17+                [ mkAttr qn18 [ mkText "" ]+                ]+                [ mkText "name"+                ]+              , mkElement qn7+                [ mkAttr qn24 [ mkText "NCName" ]+                , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                ] []+              ]+            , mkElement qn23 [] []+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "39" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "value"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "type"+                    ]+                  , mkElement qn7+                    [ mkAttr qn24 [ mkText "NCName" ]+                    , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                    ] []+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn23 [] []+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "38" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "text"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "16" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "37" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "empty"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "16" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "36" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "parentRef"+            ]+          , mkElement qn14 []+            [ mkElement qn5 []+              [ mkElement qn17+                [ mkAttr qn18 [ mkText "" ]+                ]+                [ mkText "name"+                ]+              , mkElement qn7+                [ mkAttr qn24 [ mkText "NCName" ]+                , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                ] []+              ]+            , mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "35" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "ref"+            ]+          , mkElement qn14 []+            [ mkElement qn5 []+              [ mkElement qn17+                [ mkAttr qn18 [ mkText "" ]+                ]+                [ mkText "name"+                ]+              , mkElement qn7+                [ mkAttr qn24 [ mkText "NCName" ]+                , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                ] []+              ]+            , mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "34" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "mixed"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "33" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "list"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "32" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "oneOrMore"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "31" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "zeroOrMore"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "30" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "optional"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "29" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "choice"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "28" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "interleave"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "27" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "group"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "26" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "attribute"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "name"+                    ]+                  , mkElement qn7+                    [ mkAttr qn24 [ mkText "QName" ]+                    , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                    ] []+                  ]+                , mkElement qn15 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn20 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "16" ]+                        ] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn21+                          [ mkAttr qn16 [ mkText "18" ]+                          ] []+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "19" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "20" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "21" ]+                      ] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "25" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "element"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn6 []+                [ mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "name"+                    ]+                  , mkElement qn7+                    [ mkAttr qn24 [ mkText "QName" ]+                    , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                    ] []+                  ]+                , mkElement qn15 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn20 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "16" ]+                        ] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn21+                          [ mkAttr qn16 [ mkText "18" ]+                          ] []+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "19" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "20" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "21" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "24" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "include"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn5 []+                [ mkElement qn17+                  [ mkAttr qn18 [ mkText "" ]+                  ]+                  [ mkText "href"+                  ]+                , mkElement qn7+                  [ mkAttr qn24 [ mkText "anyURI" ]+                  , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                  ] []+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "11" ]+                        ] []+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "10" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "22" ]+                      ] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "23" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "div"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn21+                          [ mkAttr qn16 [ mkText "11" ]+                          ] []+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "10" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "23" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "24" ]+                      ] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "22" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "div"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "11" ]+                        ] []+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "10" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "22" ]+                      ] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "21" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "choice"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn21+                        [ mkAttr qn16 [ mkText "18" ]+                        ] []+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "19" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "20" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "21" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "20" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "nsName"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "17" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "19" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "anyName"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "17" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "18" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "name"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn7+              [ mkAttr qn24 [ mkText "QName" ]+              , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+              ] []+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "17" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "except"+            ]+          , mkElement qn15 []+            [ mkElement qn6 []+              [ mkElement qn11 [] []+              , mkElement qn20 []+                [ mkElement qn21+                  [ mkAttr qn16 [ mkText "16" ]+                  ] []+                ]+              ]+            , mkElement qn20 []+              [ mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn21+                      [ mkAttr qn16 [ mkText "18" ]+                      ] []+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "19" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "20" ]+                    ] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "21" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "16" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn4 []+            [ mkElement qn12 []+              [ mkElement qn19+                [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                ] []+              ]+            ]+          , mkElement qn6 []+            [ mkElement qn11 [] []+            , mkElement qn20 []+              [ mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn5 []+                    [ mkElement qn4 [] []+                    , mkElement qn23 [] []+                    ]+                  , mkElement qn23 [] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "0" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "0" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn4 [] []+          , mkElement qn6 []+            [ mkElement qn11 [] []+            , mkElement qn20 []+              [ mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn5 []+                    [ mkElement qn4 [] []+                    , mkElement qn23 [] []+                    ]+                  , mkElement qn23 [] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "0" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "10" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "define"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "name"+                    ]+                  , mkElement qn7+                    [ mkAttr qn24 [ mkText "NCName" ]+                    , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                    ] []+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "combine"+                      ]+                    , mkElement qn6 []+                      [ mkElement qn25+                        [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]+                        , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                        , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/SchemaGrammar.rng" ]+                        , mkAttr qn8 [ mkText "" ]+                        , mkAttr qn24 [ mkText "token" ]+                        , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                        ]+                        [ mkText "choice"+                        ]+                      , mkElement qn25+                        [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]+                        , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                        , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/SchemaGrammar.rng" ]+                        , mkAttr qn8 [ mkText "" ]+                        , mkAttr qn24 [ mkText "token" ]+                        , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                        ]+                        [ mkText "interleave"+                        ]+                      ]+                    ]+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn20 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn6 []+                                                    [ mkElement qn21+                                                      [ mkAttr qn16 [ mkText "25" ]+                                                      ] []+                                                    , mkElement qn21+                                                      [ mkAttr qn16 [ mkText "26" ]+                                                      ] []+                                                    ]+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "27" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "28" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "29" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "30" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "31" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "32" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "33" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "34" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "35" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "36" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "37" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "38" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "39" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "40" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "43" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "44" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "14" ]+                    ] []+                  ]+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "11" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "start"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn5 []+                  [ mkElement qn17+                    [ mkAttr qn18 [ mkText "" ]+                    ]+                    [ mkText "combine"+                    ]+                  , mkElement qn6 []+                    [ mkElement qn25+                      [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]+                      , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                      , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/SchemaGrammar.rng" ]+                      , mkAttr qn8 [ mkText "" ]+                      , mkAttr qn24 [ mkText "token" ]+                      , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                      ]+                      [ mkText "choice"+                      ]+                    , mkElement qn25+                      [ mkAttr qn1 [ mkText "http://www.w3.org/XML/1998/namespace" ]+                      , mkAttr qn3 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                      , mkAttr qn2 [ mkText "file:///home/uwe/haskell/hxt/curr/src/Text/XML/HXT/RelaxNG/schema2hs/SchemaGrammar.rng" ]+                      , mkAttr qn8 [ mkText "" ]+                      , mkAttr qn24 [ mkText "token" ]+                      , mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                      ]+                      [ mkText "interleave"+                      ]+                    ]+                  ]+                ]+              , mkElement qn14 []+                [ mkElement qn14 []+                  [ mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "ns"+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  , mkElement qn6 []+                    [ mkElement qn11 [] []+                    , mkElement qn5 []+                      [ mkElement qn17+                        [ mkAttr qn18 [ mkText "" ]+                        ]+                        [ mkText "datatypeLibrary"+                        ]+                      , mkElement qn7+                        [ mkAttr qn24 [ mkText "anyURI" ]+                        , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                        ] []+                      ]+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn20 []+                    [ mkElement qn5 []+                      [ mkElement qn4 []+                        [ mkElement qn12 []+                          [ mkElement qn6 []+                            [ mkElement qn19+                              [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                              ] []+                            , mkElement qn19+                              [ mkAttr qn18 [ mkText "" ]+                              ] []+                            ]+                          ]+                        ]+                      , mkElement qn23 [] []+                      ]+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn6 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn6 []+                          [ mkElement qn6 []+                            [ mkElement qn6 []+                              [ mkElement qn6 []+                                [ mkElement qn6 []+                                  [ mkElement qn6 []+                                    [ mkElement qn6 []+                                      [ mkElement qn6 []+                                        [ mkElement qn6 []+                                          [ mkElement qn6 []+                                            [ mkElement qn6 []+                                              [ mkElement qn6 []+                                                [ mkElement qn6 []+                                                  [ mkElement qn21+                                                    [ mkAttr qn16 [ mkText "25" ]+                                                    ] []+                                                  , mkElement qn21+                                                    [ mkAttr qn16 [ mkText "26" ]+                                                    ] []+                                                  ]+                                                , mkElement qn21+                                                  [ mkAttr qn16 [ mkText "27" ]+                                                  ] []+                                                ]+                                              , mkElement qn21+                                                [ mkAttr qn16 [ mkText "28" ]+                                                ] []+                                              ]+                                            , mkElement qn21+                                              [ mkAttr qn16 [ mkText "29" ]+                                              ] []+                                            ]+                                          , mkElement qn21+                                            [ mkAttr qn16 [ mkText "30" ]+                                            ] []+                                          ]+                                        , mkElement qn21+                                          [ mkAttr qn16 [ mkText "31" ]+                                          ] []+                                        ]+                                      , mkElement qn21+                                        [ mkAttr qn16 [ mkText "32" ]+                                        ] []+                                      ]+                                    , mkElement qn21+                                      [ mkAttr qn16 [ mkText "33" ]+                                      ] []+                                    ]+                                  , mkElement qn21+                                    [ mkAttr qn16 [ mkText "34" ]+                                    ] []+                                  ]+                                , mkElement qn21+                                  [ mkAttr qn16 [ mkText "35" ]+                                  ] []+                                ]+                              , mkElement qn21+                                [ mkAttr qn16 [ mkText "36" ]+                                ] []+                              ]+                            , mkElement qn21+                              [ mkAttr qn16 [ mkText "37" ]+                              ] []+                            ]+                          , mkElement qn21+                            [ mkAttr qn16 [ mkText "38" ]+                            ] []+                          ]+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "39" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "40" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "43" ]+                      ] []+                    ]+                  , mkElement qn21+                    [ mkAttr qn16 [ mkText "44" ]+                    ] []+                  ]+                , mkElement qn21+                  [ mkAttr qn16 [ mkText "14" ]+                  ] []+                ]+              ]+            ]+          ]+        ]+      , mkElement qn9+        [ mkAttr qn16 [ mkText "14" ]+        ]+        [ mkElement qn10 []+          [ mkElement qn17+            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+            ]+            [ mkText "grammar"+            ]+          , mkElement qn14 []+            [ mkElement qn14 []+              [ mkElement qn14 []+                [ mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "ns"+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                , mkElement qn6 []+                  [ mkElement qn11 [] []+                  , mkElement qn5 []+                    [ mkElement qn17+                      [ mkAttr qn18 [ mkText "" ]+                      ]+                      [ mkText "datatypeLibrary"+                      ]+                    , mkElement qn7+                      [ mkAttr qn24 [ mkText "anyURI" ]+                      , mkAttr qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ]+                      ] []+                    ]+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn5 []+                    [ mkElement qn4 []+                      [ mkElement qn12 []+                        [ mkElement qn6 []+                          [ mkElement qn19+                            [ mkAttr qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ]+                            ] []+                          , mkElement qn19+                            [ mkAttr qn18 [ mkText "" ]+                            ] []+                          ]+                        ]+                      ]+                    , mkElement qn23 [] []+                    ]+                  ]+                ]+              ]+            , mkElement qn15 []+              [ mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn21+                    [ mkAttr qn16 [ mkText "16" ]+                    ] []+                  ]+                ]+              , mkElement qn6 []+                [ mkElement qn11 [] []+                , mkElement qn20 []+                  [ mkElement qn6 []+                    [ mkElement qn6 []+                      [ mkElement qn6 []+                        [ mkElement qn21+                          [ mkAttr qn16 [ mkText "11" ]+                          ] []+                        , mkElement qn21+                          [ mkAttr qn16 [ mkText "10" ]+                          ] []+                        ]+                      , mkElement qn21+                        [ mkAttr qn16 [ mkText "23" ]+                        ] []+                      ]+                    , mkElement qn21+                      [ mkAttr qn16 [ mkText "24" ]+                      ] []+                    ]+                  ]+                ]+              ]+            ]+          ]+        ]+      ]+    ]
+ src/Text/XML/HXT/RelaxNG/Simplification.hs view
@@ -0,0 +1,2317 @@+-- ------------------------------------------------------------++{- |+   Module     : Text.XML.HXT.RelaxNG.Simplification+   Copyright  : Copyright (C) 2008 Torben Kuseler, Uwe Schmidt+   License    : MIT++   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+   Stability  : stable+   Portability: portable++   The modul creates the simplified form of a Relax NG schema.+   See also chapter 4 of the Relax NG specification.++-}++-- ------------------------------------------------------------++module Text.XML.HXT.RelaxNG.Simplification+  ( createSimpleForm+  , getErrors+  )++where+++import Control.Arrow.ListArrows++import           Text.XML.HXT.DOM.Interface+import qualified Text.XML.HXT.DOM.XmlNode as XN+    ( mkAttr+    , mkText+    )++import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.Edit                  ( removeWhiteSpace+                                                )+import Text.XML.HXT.Arrow.Namespace             ( processWithNsEnv+                                                , propagateNamespaces+                                                )+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlState.TypeDefs++import Text.XML.HXT.RelaxNG.DataTypes+import Text.XML.HXT.RelaxNG.BasicArrows+import Text.XML.HXT.RelaxNG.CreatePattern+import Text.XML.HXT.RelaxNG.DataTypeLibraries+import Text.XML.HXT.RelaxNG.Utils+import Text.XML.HXT.RelaxNG.Validation+import Text.XML.HXT.RelaxNG.Schema        as S+import Text.XML.HXT.RelaxNG.SchemaGrammar as SG++import Data.Maybe+    ( fromJust+    , fromMaybe+    , isNothing+    )+import Data.List+    ( elemIndices+    , isPrefixOf+    , nub+    , deleteBy+    , find+    , (\\)+    )++import System.Directory+  ( doesFileExist )+++-- ------------------------------------------------------------++{-+- 4.1. Annotations: Foreign attributes and elements are removed.+- 4.2. Whitespace:+    - For each element other than value and param, each child that is a string+      containing only whitespace characters is removed. -> fertig+    - Leading and trailing whitespace characters are removed from the value of each name,+      type and combine attribute and from the content of each name element. -> fertig+- 4.3. datatypeLibrary attribute:+    - The value of each datatypeLibary attribute is transformed by escaping disallowed characters+    - For any data or value element that does not have a datatypeLibrary attribute,+      a datatypeLibrary attribute is added.+    - Any datatypeLibrary attribute that is on an element other than data or value is removed.+- 4.4. type attribute of value element+-}+simplificationStep1 :: IOSArrow XmlTree XmlTree+simplificationStep1+    = ( {-+        - 4.5. href attribute+        - The value of the href attribute on an externalRef or include element is first+        - transformed by escaping disallowed characters+        - The URI reference is then resolved into an absolute form+        - The value of the href attribute will be used to construct an element.+        -}+        ( processHref $< getBaseURI )+        >>>+        -- 4.10 QNames+        processWithNsEnv processEnvNames (toNsEnv [("xml",xmlNamespace)])+        >>>+        -- 4.4 For any data or value element that does not have a datatypeLibrary attribute,+        -- a datatypeLibrary attribute is added.+        -- Wird vorgezogen, da danach der Rest in einem Baumdurchlauf erledigt werden kann+        processdatatypeLib ""+        >>>+        processTopDownWithAttrl+        (+         ( -- 4.1 Foreign attributes and elements are removed+           none+           `when`+           ( ( isElem >>> neg isRoot+               >>>+               getNamespaceUri+               >>>+               isA (\ uri -> (not $ compareURI uri relaxNamespace))+             )+             `orElse`+             ( isAttr+               >>>+               getNamespaceUri+               >>>+               isA (\ uri -> (uri /= "" && (not $ compareURI uri relaxNamespace)))+             )+           )+         )+         >>>+         ( -- 4.2 For each element other than value and param, each child that+           -- is a string containing only whitespace characters is removed.+           ( processChildren removeWhiteSpace+             `whenNot`+             (isRngParam `orElse` isRngValue)+           )+           `when` isElem+         )+         >>>+         ( -- 4.2 Leading and trailing whitespace characters are removed from the value+           -- of each name, type and combine attribute ...+           changeAttrValue normalizeWhitespace+           `when`+           ( isRngAttrName `orElse` isRngAttrType `orElse` isRngAttrCombine)+         )+         >>>+         ( -- 4.2 ... and from the content of each name element.+           processChildren (changeText normalizeWhitespace)+           `when`+           isRngName+         )+         >>>+         ( -- 4.3 The value of each datatypeLibary attribute is transformed+           -- by escaping disallowed characters+           changeAttrValue escapeURI+           `when`+           isRngAttrDatatypeLibrary+         )+         >>>+         ( -- The value of the datatypeLibary attribute has to be a valid URI+           ( mkRelaxError "" $< ( getRngAttrDatatypeLibrary+                                  >>>+                                  arr (\ a -> ( "datatypeLibrary attribute: " +++                                                a ++ " is not a valid URI"+                                              )+                                      )+                                )+           )+           `when`+           ( isElem+             >>>+             hasRngAttrDatatypeLibrary+             >>>+             getRngAttrDatatypeLibrary >>> isA (not . isRelaxAnyURI)+           )+         )+         >>>+         ( -- 4.3 Any datatypeLibrary attribute that is on an element+           -- other than data or value is removed.+           removeAttr "datatypeLibrary"+           `when`+           ( isElem+             >>>+             neg (isRngData `orElse` isRngValue)+             >>>+             hasRngAttrDatatypeLibrary+           )+         )+         >>>+         ( -- 4.4 For any value element that does not have a type attribute,+           -- a type attribute is added with value token and the value of+           -- the datatypeLibrary attribute is changed to the empty string.+           ( addAttr "type" "token"+             >>>+             addAttr "datatypeLibrary" ""+           )+           `when`+           ( isRngValue >>> neg hasRngAttrType )+         )+        )+      ) `when` collectErrors+    where+    processHref :: String -> IOSArrow XmlTree XmlTree+    processHref uri+        = processChildren+          ( choiceA+            [ ( isElem >>> hasAttr "xml:base" )+              :-> ( ifA ( isExternalRefInclude >>> hasRngAttrHref )+                    ( -- The value of the href attribute is transformed by+                      -- escaping disallowed characters+                      (processAttrl (changeAttrValue escapeURI `when` isRngAttrHref))+                      >>> -- compute the new base uri from the old uri and the href attribute+                      (addAttr "href" $< (absURI "href" $< (absURI "xml:base" uri)))+                      >>>+                      (processHref $< absURI "xml:base" uri)+                    ) -- element without a href attribute, just compute the new base uri+                    (processHref $< absURI "xml:base" uri)+                  )+            , ( isExternalRefInclude >>> hasRngAttrHref )+              :-> ( -- The value of the href attribute is transformed by+                    -- escaping disallowed characters+                    (processAttrl (changeAttrValue escapeURI `when` isRngAttrHref))+                    >>>+                    (addAttr "href" $< absURI "href" uri)+                  )+            , this+              :-> processHref uri+            ]+          )+        where+        absURI :: String -> String -> IOSArrow XmlTree String+        absURI attrName u+            = ( getAttrValue attrName+                >>>+                arr (\ a -> fromMaybe "" (expandURIString a u))+                >>> -- the uri should not have a fragment-identifier (4.5)+                ( arr ("illegal URI, fragment identifier not allowed: " ++)+                  `whenNot`+                  (getFragmentFromURI >>> isA null)+                )+              )++    processEnvNames :: NsEnv -> IOSArrow XmlTree XmlTree+    processEnvNames env+        = ( ( (replaceQNames env $< getAttrValue "name")+              `when`+              ( (isRngElement `orElse` isRngAttribute)+                >>>+                getRngAttrName+                >>>+                isA (elem ':')+              )+            )+            >>>+            ( (addAttrl (getBaseURI >>> createAttrL))+              `when`+              isRngValue+            )+          )+        where+        createAttrL :: IOSArrow String XmlTree+        createAttrL+            = setBaseUri &&& constA (map createAttr env) >>> arr2L (:)+            where++            createAttr :: (XName, XName) -> XmlTree+            createAttr (pre, uri)+                = XN.mkAttr (mkName nm) [XN.mkText (show uri)]+                where+                nm  | isNullXName pre   = "RelaxContextDefault"+                    | otherwise         = contextAttributes ++ show pre++            setBaseUri :: IOSArrow String XmlTree+            setBaseUri = mkAttr (mkName contextBaseAttr) (txt $< this)++        replaceQNames :: NsEnv -> String -> IOSArrow XmlTree XmlTree+        replaceQNames e name+            | isNothing uri+                = mkRelaxError "" ( "No Namespace-Mapping for the prefix " ++ show pre +++                                    " in the Context of Element: " ++ show name+                                  )+            | otherwise+                = addAttr "name" ( "{" ++ (show . fromJust $ uri) ++ "}" ++ local )+            where+            (pre, local') = span (/= ':') name+            local         = tail local'+            uri         :: Maybe XName+            uri           = lookup (newXName pre) e++    -- The value of the added datatypeLibrary attribute is the value of the+    -- datatypeLibrary attribute of the nearest ancestor element that+    -- has a datatypeLibrary attribute, or the empty string+    -- if there is no such ancestor.+    processdatatypeLib :: (ArrowXml a) => String -> a XmlTree XmlTree+    processdatatypeLib lib+        = processChildren $+          choiceA+          [ ( isElem >>> hasRngAttrDatatypeLibrary+            -- set the new datatypeLibrary value+            )+            :->+            ( processdatatypeLib $< getRngAttrDatatypeLibrary )+          , ( (isRngData `orElse` isRngValue)+              >>>+              neg hasRngAttrDatatypeLibrary+              -- add a datatypeLibrary attribute+            )+            :->+            ( addAttr "datatypeLibrary" lib >>> processdatatypeLib lib )+          , this+            :->+            processdatatypeLib lib+          ]++-- ------------------------------------------------------------+++{-+- 4.5. href attribute+    - see simplificationStep1+- 4.6. externalRef element+    - An element is constructed using the URI reference+      that is the value of href attribute+    - This element must match the syntax for pattern.+    - The element is transformed by recursively applying the rules from+      this subsection and from previous subsections of this section.+    - This must not result in a loop.+    - Any ns attribute on the externalRef element is transferred+      to the referenced element if the referenced element does+      not already have an ns attribute.+    - The externalRef element is then replaced by the referenced element.+- 4.7. include element+    - An element is constructed using the URI reference that is the+      value of href attribute+    - This element must be a grammar element, matching the syntax for grammar.+    - This grammar element is transformed by recursively applying the rules+      from this subsection and from previous subsections of this section.+    - This must not result in a loop.++    - If the include element has a start component, then the grammar element+      must have a start component.+    - If the include element has a start component, then all start components+      are removed from the grammar element.+    - If the include element has a define component, then the grammar element+      must have a define component with the same name.+    - For every define component of the include element, all define components+      with the same name are removed from the grammar element.++    - The include element is transformed into a div element.+    - The attributes of the div element are the attributes of the+      include element other than the href attribute.+    - The children of the div element are the grammar element+    - The grammar element is then renamed to div.+-}++simplificationStep2 :: Bool -> Bool -> [Uri] -> [Uri] -> IOSArrow XmlTree XmlTree+simplificationStep2 validateExternalRef validateInclude extHRefs includeHRefs =+  ( processTopDown (+      ( (importExternalRef $<< (getRngAttrNs &&& getRngAttrHref))+        `when`+        isRngExternalRef+      )+      >>>+      ( (importInclude $< getAttrValue "href")+        `when`+        isRngInclude+      )+    )+  ) `when` collectErrors+  where+  importExternalRef :: String -> String -> IOSArrow XmlTree XmlTree+  importExternalRef ns href+    = ifA ( neg $ constA href+                  >>> getPathFromURI+                  >>> ( isA (not . ("illegal URI" `isPrefixOf`))+                        `guards`+                        isIOA doesFileExist+                      )+          )+        ( mkRelaxError ""+          ( show href +++            ": can't read URI, referenced in externalRef-Pattern"+          )+        )+        ( ifP (const $ elem href extHRefs)+           -- if the referenced name already exists in the list of processed ref attributes+           -- we have found a loop+            ( mkRelaxError ""+              (  "loop in externalRef-Pattern, " +++                 formatStringListArr (reverse $ href:extHRefs)+              )+            )+            ( ifA ( if validateExternalRef                                      -- if validation parameters are set+                    then validateDocWithRelax S.relaxSchemaArrow [] href        -- the referenced schema is validated with respect to+                    else none                                                   -- the Relax NG specification+                  )+                ( mkRelaxError ""+                  ( "The content of the schema " ++ show href +++                    ", referenced in externalRef does not " +++                    "match the syntax for pattern"+                  )+                )+                ( readForRelax href+                  >>>+                  simplificationStep1                                           -- perform the transformations from previous steps+                  >>>+                  simplificationStep2 validateExternalRef validateInclude (href:extHRefs) includeHRefs+                  >>>+                  getChildren -- remove the root node+                  >>>+                  ( -- Any ns attribute on the externalRef element+                    -- is transferred to the referenced element+                    addAttr "ns" ns+                    `when`+                    (getRngAttrNs >>> isA (\a -> a == "" && ns /= ""))+                  )+                )+            )+        )++  importInclude :: String -> IOSArrow XmlTree XmlTree+  importInclude href+    = ifA ( -- test whether the referenced schema exists+            neg $ constA href >>> getPathFromURI >>> isIOA doesFileExist+          )+        ( mkRelaxError ""+          ( "Can't read " ++ show href +++            ", referenced in include-Pattern"+          )+        )+        ( ifP (const $ elem href includeHRefs)+           -- if the referenced name still exists in the list of processed+           -- ref attributes we have found a loop+            ( mkRelaxError ""+              ( "loop in include-Pattern, " +++                formatStringListArr (reverse $ href:includeHRefs)+              )+            )+            ( ifA ( if validateInclude                                          -- if the parameter is set+                    then validateDocWithRelax SG.relaxSchemaArrow [] href       -- the referenced schema is validated with respect to+                    else none                                                   -- the Relax NG grammar element+                  )+                ( mkRelaxError ""+                  ( "The content of the schema " ++ show href +++                    ", referenced in include does not match " +++                    "the syntax for grammar"+                  )+                )+                ( processInclude href $< ( readForRelax href+                                           >>>+                                           simplificationStep1                          -- perform the transformations from previous steps+                                           >>>+                                           simplificationStep2 validateExternalRef validateInclude extHRefs (href:includeHRefs)+                                           >>>+                                           getChildren                                  -- remove the root node+                                         )+                )+            )+        )++  processInclude :: String -> XmlTree -> IOSArrow XmlTree XmlTree+  processInclude href newDoc+    = -- The include element is transformed into a div element.+      setRngNameDiv+      >>>+      -- The attributes of the div element are the attributes of+      -- the include element other than the href attribute.+      removeAttr "href"+      >>>+      checkInclude href newDoc+++  insertNewDoc :: XmlTree -> Bool -> [String] -> IOSArrow XmlTree XmlTree+  insertNewDoc newDoc hasStart defNames+    = insertChildrenAt 0 $+        constA newDoc+        >>>+        -- If the include element has a start component, then all start components+        -- are removed from the grammar element.+        (removeStartComponent `whenP` (const hasStart))+        >>>+        -- For every define component of the include element, all define components+        -- with the same name are removed from the grammar element.+        ((removeDefineComponent defNames) `whenP` (const $ defNames /= []))+        >>>+        -- The grammar element is then renamed to div.+        setRngNameDiv+++  checkInclude :: String -> XmlTree -> IOSArrow XmlTree XmlTree+  checkInclude href newDoc+    = ifA ( -- If the include element has a start component, then the grammar element+            -- must have a start component.+            hasStartComponent &&& (constA newDoc >>> hasStartComponent)+            >>>+            isA (\ (a, b) -> if a then b else True)+          )+        ( ifA ( -- If the include element has a define component, then the grammar element+                -- must have a define component with the same name.+                getDefineComponents &&& (constA newDoc >>> getDefineComponents)+                >>>+                isA (\ (a, b) -> (diff a b) == [])+              )+            (insertNewDoc newDoc $<< hasStartComponent &&& getDefineComponents)+            ( mkRelaxError ""+              ( "Define-pattern missing in schema " ++ show href +++                ", referenced in include-pattern"+              )+            )+        )+        ( mkRelaxError ""+          ( "Grammar-element without a start-pattern in schema " +++            show href ++ ", referenced in include-pattern"+          )+        )+    where+    diff a b = (noDoubles a) \\ (noDoubles b)++  removeStartComponent :: IOSArrow XmlTree XmlTree+  removeStartComponent+    = processChildren $+        choiceA [+          isRngStart :-> none,+          isRngDiv   :-> removeStartComponent,+          this       :-> this+        ]++  removeDefineComponent :: [String] -> IOSArrow XmlTree XmlTree+  removeDefineComponent defNames+    = processChildren $+        choiceA [+          ( isRngDefine+            >>>+            getRngAttrName+            >>>+            isA (\n -> elem n defNames))          :-> none,+          (isElem >>> getName >>> isA (== "div")) :-> (removeDefineComponent defNames),+          (constA "foo" >>> isA (== "foo"))       :-> this+        ]++  hasStartComponent :: IOSArrow XmlTree Bool+  hasStartComponent = listA hasStartComponent' >>> arr (any id)+    where+    hasStartComponent' :: IOSArrow XmlTree Bool+    hasStartComponent'+      = getChildren+        >>>+        choiceA [+          isRngStart :-> (constA True),+          isRngDiv   :-> hasStartComponent',+          this       :-> (constA False)+        ]++  getDefineComponents :: IOSArrow XmlTree [String]+  getDefineComponents = listA getDefineComponents'+                        >>>+                        arr (\xs -> [x | x <- xs, x /= ""])+    where+    getDefineComponents' :: IOSArrow XmlTree String+    getDefineComponents'+      = getChildren+        >>>+        choiceA+        [ isRngDefine :-> getRngAttrName+        , isRngDiv    :-> getDefineComponents'+        , this        :-> constA ""+        ]+++-- ------------------------------------------------------------+++{-+- 4.8. name attribute of element and attribute elements+    - The name attribute on an element or attribute element+      is transformed into a name child element.+    - If an attribute element has a name attribute but no ns attribute,+      then an ns="" attribute is added to the name child element.+- 4.9. ns attribute+    - For any name, nsName or value element that does not have+      an ns attribute, an ns attribute is added.+    - any ns attribute that is on an element other than name,+      nsName or value is removed.+- 4.10. QNames+    - For any name element containing a prefix, the prefix is removed+      and an ns attribute is added replacing any existing ns attribute.+    - The value of the added ns attribute is the value to which the+      namespace map of the context of the name element maps the prefix.+    - The context must have a mapping for the prefix.+-}+simplificationStep3 :: IOSArrow XmlTree XmlTree+simplificationStep3 =+  ( processTopDown (+      ( -- 4.8 The name attribute on an element or attribute+        -- element is transformed into a name child element+        ( insertChildrenAt 0 (mkRngName none (txt $< getRngAttrName))+        )+        >>>+        ( -- 4.8 If an attribute element has a name attribute but no ns attribute,+          --  then an ns="" attribute is added to the name child element+           (processChildren (addAttr "ns" "" `when` isRngName))+           `when`+           (isRngAttribute >>> hasRngAttrName >>> neg hasRngAttrNs)+        )+        >>>+        removeAttr "name"+      )+      `when`+      ( (isRngElement `orElse` isRngAttribute) >>> hasRngAttrName )+    )+    >>>+    -- 4.9 For any name, nsName or value element that does not have+    -- an ns attribute, an ns attribute is added.+    processnsAttribute ""+    >>>+    processTopDown (+      ( -- 4.9 any ns attribute that is on an element other than name,+        -- nsName or value is removed.+        (removeAttr "ns")+        `when`+        (isElem >>> neg (isRngName `orElse` isRngNsName `orElse` isRngValue))+      )+      >>>+      ( -- 4.10 For any name element containing a prefix, the prefix is removed and an ns attribute+        -- is added replacing any existing ns attribute.+        (replaceNameAttr $< (getChildren >>> isText >>> getText))+        `when`+        isRngName+      )+    )+  ) `when` collectErrors+  where+  replaceNameAttr :: (ArrowXml a) => String -> a XmlTree XmlTree+  replaceNameAttr name+    = (addAttr "ns" pre >>> processChildren (changeText $ const local))+      `whenP`+      (const $ elem '}' name)+    where+    (pre', local') = span (/= '}') name+    pre            = tail pre'+    local          = tail local'++  processnsAttribute :: String -> IOSArrow XmlTree XmlTree+  processnsAttribute name+    = processChildren $+        choiceA [+          -- set the new ns attribute value+          (isElem >>> hasRngAttrNs)+               :-> (processnsAttribute $< getRngAttrNs),+          -- For any name, nsName or value element that does not have+          -- an ns attribute, an ns attribute is added.+          ( isNameNsNameValue >>> neg hasRngAttrNs)+               :-> (addAttr "ns" name >>> processnsAttribute name),+          this :-> (processnsAttribute name)+        ]+++-- ------------------------------------------------------------+++{-+- 4.11 Each div element is replaced by its children+- 4.12 Number of child elements+    - A define, oneOrMore, zeroOrMore, optional, list or mixed element+      is transformed so that it has exactly one child element+    - An element element is transformed so that it has exactly two child elements+    - A except element is transformed so that it has exactly one child element+    - If an attribute element has only one child element (a name class), then a text element is added.+    - A choice, group or interleave element is transformed so that it has exactly two child elements.+- 4.13 A mixed element is transformed into an interleaving with a text element+- 4.14 An optional element is transformed into a choice with empty+- 4.15 A zeroOrMore element is transformed into a choice between oneOrMore and empty+- 4.16. Constraints: no transformation is performed, but various constraints are checked.+    - An except element that is a child of an anyName element must not have any anyName descendant elements.+    - An except element that is a child of an nsName element must not have any nsName or anyName+      descendant elements.+    - A name element that occurs as the first child of an attribute element or as the descendant of the+      first child of an attribute element and that has an ns attribute with value equal to the empty+      string must not have content equal to xmlns.+    - A name or nsName element that occurs as the first child of an attribute element or as the+      descendant of the first child of an attribute element must not have an ns attribute with+      value http://www.w3.org/2000/xmlns.+    - A data or value element must be correct in its use of datatypes.+-}+simplificationStep4 :: IOSArrow XmlTree XmlTree+simplificationStep4 =+  ( processTopDown (+      ( -- Each div element is replaced by its children.+        (getChildren >>> simplificationStep4)+        `when`+        isRngDiv+      )+      >>>+      ( -- A define, oneOrMore, zeroOrMore, optional, list or mixed element+        -- is transformed so that it has exactly one child element+        ( replaceChildren+          ( mkRngGroup+            (setChangesAttr $< (getName >>> arr ("group-Pattern: " ++)))+            getChildren+          )+        )+        `when`+        (  isDefineOneOrMoreZeroOrMoreOptionalListMixed+           >>>+           noOfChildren (> 1)+        )+      )+      >>>+      ( -- An element element is transformed so that it has exactly two child elements+        ( replaceChildren+          ( ( getChildren >>> isNameAnyNameNsName )+            <+>+            ( mkRngGroup none+              ( getChildren+                >>>+                neg isNameAnyNameNsName+              )+            )+          )+        )+        `when`+        ( isRngElement >>> noOfChildren (> 2) )+      )+      >>>+      ( -- A except element is transformed so that it has exactly one child element.+        replaceChildren ( mkRngChoice none getChildren )+        `when`+        ( isRngExcept >>> noOfChildren (> 1) )+      )+      >>>+      ( -- If an attribute element has only one child element+        -- (a name class), then a text element is added.+        insertChildrenAt 1 (mkRngText none)+        `when`+        ( isRngAttribute >>> noOfChildren (== 1) )+      )+      >>>+      ( -- A choice, group or interleave element is transformed so+        -- that it has exactly two child elements.+        ((wrapPattern2Two $< getName) >>> simplificationStep4)+        `when`+        (  isChoiceGroupInterleave+           >>>+           noOfChildren (\ i -> i > 2 || i == 1)+        )+      )+      >>>+      ( -- A mixed element is transformed into an interleaving with a text element+        ( mkRngInterleave+          ( setChangesAttr "mixed is transformed into an interleave" )+          ( getChildren+            <+>+            mkRngText+            ( setChangesAttr ( "new text-Pattern: mixed is transformed into " +++                                  " an interleave with text"+                             )+            )+          )+        )+        `when`+        isRngMixed+      )+      >>>+      ( -- An optional element is transformed into a choice with empty+        ( mkRngChoice+          ( setChangesAttr "optional is transformed into a choice" )+          ( getChildren+            <+>+            mkRngEmpty+            ( setChangesAttr ( "new empty-Pattern: optional is transformed " +++                               " into a choice with empty"+                             )+            )+          )+        )+        `when`+        isRngOptional+      )+      >>>+      ( -- A zeroOrMore element is transformed into a choice between oneOrMore and empty+        ( mkRngChoice+          ( setChangesAttr "zeroOrMore is transformed into a choice" )+          ( ( mkRngOneOrMore+              ( setChangesAttr ( "zeroOrMore is transformed into a " +++                                   "choice between oneOrMore and empty"+                               )+              )+              getChildren+            )+            <+>+            ( mkRngEmpty+              ( setChangesAttr ( "new empty-Pattern: zeroOrMore is transformed " +++                                   "into a choice between oneOrMore and empty"+                               )+              )+            )+          )+        )+        `when`+        isRngZeroOrMore+      )+    )+  ) `when` collectErrors+++-- ------------------------------------------------------------+++restrictionsStep1 :: IOSArrow XmlTree XmlTree+restrictionsStep1 =+  ( processTopDown (+      ( ( mkRelaxError ""+          ( "An except element that is a child of an anyName " +++            "element must not have any anyName descendant elements"+          )+        )+        `when`+        ( isRngAnyName+          >>>+          getChildren+          >>>+          isRngExcept+          >>>+          deep isRngAnyName+        )+      )+      >>>+      ( ( mkRelaxError ""+          ( "An except element that is a child of an nsName element " +++            "must not have any nsName or anyName descendant elements."+          )+        )+        `when`+        ( isRngNsName+          >>>+          getChildren+          >>>+          isRngExcept+          >>>+          deep (isRngAnyName `orElse` isRngNsName)+        )+      )+      >>>+      ( ( mkRelaxError ""+          ( "A name element that occurs as the first child or descendant of " +++            "an attribute and has an ns attribute with an empty value must " +++            "not have content equal to \"xmlns\""+          )+        )+        `when`+        ( isRngAttribute+          >>>+          firstChild+          >>>+          ( multi (isRngName >>> hasRngAttrNs) )+          >>>+          ( ( getRngAttrNs >>> isA null)+            `guards`+            (getChildren >>> getText >>> isA (== "xmlns"))+          )+        )+      )+      >>>+      ( ( mkRelaxError ""+          ( "A name or nsName element that occurs as the first child or " +++            "descendant of an attribute must not have an ns attribute " +++            "with value http://www.w3.org/2000/xmlns"+          )+        )+        `when`+        ( isRngAttribute+          >>>+          firstChild+          >>>+          ( multi (isNameNsName >>> hasRngAttrNs) )+          >>>+          getRngAttrNs+          >>>+          isA (compareURI xmlnsNamespace)+        )+      )+      >>> -- A data or value element must be correct in its use of datatypes.+      ( ( checkDatatype $<< getRngAttrDatatypeLibrary &&& getRngAttrType )+        `when`+        ( isRngData `orElse` isRngValue )+      )+    )+  ) `when` collectErrors+  where++  -- the datatypeLibrary attribute must identify a valid datatype library++  checkDatatype :: Uri -> DatatypeName -> IOSArrow XmlTree XmlTree+  checkDatatype libName typeName+      = ifP (const $ elem libName $ map fst datatypeLibraries)+        ( checkType libName typeName allowedDataTypes )+        ( mkRelaxError ""+          ( "DatatypeLibrary " ++ show libName ++ " not found" )+        )+    where+    DTC _ _ allowedDataTypes = fromJust $ lookup libName datatypeLibraries++  -- the type attribute must identify a datatype within the datatype library identified+  -- by the value of the datatypeLibrary attribute.++  checkType :: Uri -> DatatypeName -> AllowedDatatypes -> IOSArrow XmlTree XmlTree+  checkType libName typeName allowedTypes+      = ifP (const $ elem typeName $ map fst allowedTypes)+        ( checkParams typeName libName getParams $<+          ( listA (getChildren >>> isRngParam >>> getRngAttrName) )+        )+       ( mkRelaxError ""+         ( "Datatype " ++ show typeName +++           " not declared for DatatypeLibrary " ++ show libName+         )+       )+    where+    getParams = fromJust $ lookup typeName allowedTypes++  -- For a data element, the parameter list must be one that is allowed by the datatype++  checkParams :: DatatypeName -> Uri -> AllowedParams -> [ParamName] -> IOSArrow XmlTree XmlTree+  checkParams typeName libName allowedParams paramNames+      = ( mkRelaxError ""+          ( "Param(s): " ++ formatStringListQuot diff +++            " not allowed for Datatype " ++ show typeName +++            " in Library " +++            show ( if null libName+                   then relaxNamespace+                   else libName+                 )+          )+        )+        `when`+        ( isRngData >>> isA (const $ diff /= []) )+      where+      diff = filter (\param -> not $ elem param allowedParams) paramNames+++-- ------------------------------------------------------------+++{-+- 4.17. combine attribute+    - For each grammar element, all define elements with the same name are combined together.+    - Similarly, for each grammar element all start elements are combined together.+- 4.18. grammar element+    - A grammar must have a start child element.+    - Transform the top-level pattern p into <grammar><start>p</start></grammar>.+    - Rename define elements so that no two define elements anywhere in the schema+      have the same name. To rename a define element, change the value of its name+      attribute and change the value of the name attribute of all ref and parentRef+      elements that refer to that define element.+    - Move all define elements to be children of the top-level grammar element+    - Replace each nested grammar element by the child of its start element+    - Rename each parentRef element to ref.+-}+simplificationStep5 :: IOSArrow XmlTree XmlTree+simplificationStep5+    = ( processTopDown+        ( ( ( ( (deep isRngRelaxError)+                <+>+                ( mkRelaxError "" "A grammar must have a start child element" )+              )+              `when`+              (neg (getChildren >>> isRngStart))+            )+            >>>+            -- For each grammar element, all define elements with the same+            -- name are combined together.+            ( combinePatternList "define" $< (getPatternNamesInGrammar "define" >>> arr nub) )+            >>>+            -- Similarly, for each grammar element all start elements+            -- are combined together.+            ( combinePatternList "start" $< (getPatternNamesInGrammar "start" >>> arr nub) )+          )+          `when`+          isRngGrammar+        )+        >>>+        ( -- transform the top-level pattern p into <grammar><start>p</start></grammar>.+          ( replaceChildren+            ( mkRngGrammar none+              ( mkRngStart none getChildren )+            )+          )+          `when`+          neg (getChildren >>> isRngGrammar)+        )+        >>>+        ( renameDefines $<<+          ( getPatternNamesInGrammar "define"+            >>>+            (createUniqueNames $< incrSysVar theRelaxDefineId)+            &&&+            constA []+          )+        )+        >>>+        -- Move all define elements to be children of the top-level grammar element+        ( processChildren+          ( -- root node+            processChildren+            ( -- the first grammar pattern remains unchanged+              ( deleteAllDefines+                <+>+                ( getAllDefines >>> processChildren deleteAllDefines )+              )+              >>>+              processTopDown+              ( ( -- Replace each nested grammar element by the child of its start element+                  ( getChildren >>> isRngStart >>> getChildren )+                  `when`+                  isRngGrammar+                )+                >>>+                ( -- Rename each parentRef element to ref.+                  ( setRngNameRef+                    `when`+                    isRngParentRef+                  )+                )+              )+            )+          )+        )+      ) `when` collectErrors+    where+    getPatternNamesInGrammar :: (ArrowXml a) => String -> a XmlTree [String]+    getPatternNamesInGrammar pattern+        = processChildren+          ( processTopDown ( none `when` isRngGrammar ) )+          >>>+          listA ( (multi (isElem >>> hasRngName pattern))+                  >>>+                  getRngAttrName+                )++    createUniqueNames :: Int -> IOSArrow [String] RefList+    createUniqueNames num+        = arr (\ l -> unique l num)+          >>>+          perform (setSysAttrInt "define_id" $< arr (max num . getNextValue))+        where+        unique :: [String] -> Int -> RefList+        unique []     _    = []+        unique (x:xs) num' = (x, (show num')):(unique xs (num'+1))+        getNextValue :: RefList -> Int+        getNextValue [] = 0+        getNextValue rl = maximum (map (read . snd) rl) + 1++    renameDefines :: RefList -> RefList -> IOSArrow XmlTree XmlTree+    renameDefines ref parentRef+        = processChildren+          ( choiceA+            [ isRngDefine+              :-> ( -- the original name is needed for error messages+                    addAttr defineOrigName $< getRngAttrName+                    >>>+                    -- rename the define-pattern+                    -- the new name is looked up in the ref table+                    addAttr "name" $< ( getRngAttrName+                                        >>>+                                        arr (\n -> fromJust $ lookup n ref)+                                      )+                    >>>+                    renameDefines ref parentRef+                  )+            , isRngGrammar+              :-> ( renameDefines $<< ( ( -- compute all define names in the grammar+                                          getPatternNamesInGrammar "define"+                                          >>>+                                          -- create a new (unique) name for all define names+                                          (createUniqueNames $< (getSysAttrInt 0 "define_id"))+                                        )+                                        &&&+                                        -- set the old ref list to be the new parentRef list+                                        constA ref+                                      )+                  )+            , isRngRef+              :-> ( ifA ( getRngAttrName+                          >>>+                          isA (\name -> (elem name (map fst ref)))+                        )+                    ( -- the original name is needed for error messages+                      addAttr defineOrigName $< getRngAttrName+                      >>>+                      -- rename the ref-pattern+                      -- the new name is looked up in the ref table+                      addAttr "name" $< ( getRngAttrName+                                          >>>+                                          arr (\n -> fromJust $ lookup n ref)+                                        )+                    )+                    ( -- the referenced pattern does not exist in the schema+                      mkRelaxError "" $< ( getRngAttrName+                                           >>>+                                           arr (\ n -> ( "Define-Pattern with name " ++ show n +++                                                         " referenced in ref-Pattern not " +++                                                         "found in schema"+                                                       )+                                               )+                                         )+                    )+                  )+            , isRngParentRef -- same as ref, but the parentRef list is used+              :-> ( ifA ( getRngAttrName+                          >>>+                          isA (\name -> (elem name (map fst parentRef)))+                        )+                    ( addAttr defineOrigName $< getRngAttrName+                      >>>+                      addAttr "name" $< ( getRngAttrName+                                          >>>+                                          arr (\n -> fromJust $ lookup n parentRef)+                                        )+                    )+                    ( mkRelaxError "" $<+                      ( getRngAttrName+                        >>>+                        arr (\ n -> ( "Define-Pattern with name " ++ show n +++                                      " referenced in parentRef-Pattern " +++                                      "not found in schema"+                                    )+                            )+                      )+                    )+                  )+            , this+              :-> renameDefines ref parentRef+            ]+          )+++    getAllDefines :: IOSArrow XmlTree XmlTree+    getAllDefines = multi isRngDefine++    deleteAllDefines :: IOSArrow XmlTree XmlTree+    deleteAllDefines = processTopDown $ none `when` isRngDefine++    combinePatternList :: String -> [String] -> IOSArrow XmlTree XmlTree+    combinePatternList _ [] = this+    combinePatternList pattern (x:xs)+        = (replaceChildren $ combinePattern pattern x)+          >>>+          combinePatternList pattern xs++    -- combine a define- or start-pattern (first parameter) with a+    -- specific name (second parameter)+    combinePattern :: String -> String -> IOSArrow XmlTree XmlTree+    combinePattern pattern name+        = createPatternElems pattern name+          <+>+          (getChildren >>> deletePatternElems pattern name)++    createPatternElems :: String -> String -> IOSArrow XmlTree XmlTree+    createPatternElems pattern name+        = ( ( (listA (getElems pattern name >>> getRngAttrCombine))+              >>>+              checkPatternCombine pattern name+            )+            -- After determining this unique value, the combine attributes are removed.+            &&&+            (listA (getElems pattern name >>> removeAttr "combine")))+          >>> -- ((errorCode::Int,errorMessage::String), result::XmlTrees)+          choiceA+          [ isA (\ ((code,_) , _)   -> code == 0)+            :->+            (mkRelaxError "" $< arr (snd . fst))+          , isA (\ ((code,str) , _) -> code == 1 && str == "")+            :->+            arrL snd+          , isA (\ ((code,str) , _) -> code == 1 && str /= "")+            :->+            ( createPatternElem pattern name $<<+              ( arr (snd . fst) &&& (arr snd) )+            )+          , this+            :->+            ( mkRelaxError ""+              ( "Can't create Pattern: " ++ show pattern +++                " with name " ++ show name ++ " in createPatternElems"+              )+            )+          ]++    createPatternElem :: (ArrowXml a) => String -> String -> String -> XmlTrees -> a n XmlTree+    createPatternElem pattern name combine trees+        = mkRngElement pattern (mkAttr (mkName "name") (txt name))+          ( ( mkRngElement combine none+              (arrL (const trees) >>> getChildren)+            )+            >>>+            wrapPattern2Two combine+          )++    checkPatternCombine :: (ArrowXml a) => String -> String -> a [String] (Int, String)+    checkPatternCombine pattern name+        = choiceA+          [ -- just one pattern with that name -> ok, no combine is needed+            (isA (\ cl -> length cl == 1))+            :->+            constA (1, "")+          , (isA (\ cl -> (length $ elemIndices "" cl) > 1))+            :->+            constA ( 0+                   , "More than one " ++ pattern ++ "-Pattern: " ++ show name +++                     " without an combine-attribute in the same grammar"+                   )+          , (isA (\ cl -> (length $ nub $ deleteBy (==) "" cl) > 1))+            :->+            arr (\ cl -> ( 0+                         , "Different combine-Attributes: " +++                           (formatStringListQuot $ noDoubles cl) +++                           " for the " ++ pattern ++ "-Pattern " +++                           show name ++ " in the same grammar"+                         )+                )+          , -- ok -> combine value is returned+            this+            :->+            arr (\ cl -> (1, fromJust $ find (/= "") cl))+          ]++    isElemWithNameValue :: (ArrowXml a) => String -> String -> a XmlTree XmlTree+    isElemWithNameValue ename nvalue+        = ( isElem+            >>>+            hasRngName ename+            >>>+            getRngAttrName+            >>>+            isA (== nvalue)+          )+          `guards` this++    getElems :: (ArrowXml a) => String -> String -> a XmlTree XmlTree+    getElems pattern name+        = getChildren+          >>>+          choiceA+          [ isElemWithNameValue pattern name+            :->+            (this <+> getElems pattern name)+          , isRngGrammar+            :-> none+          , this+            :->+            getElems pattern name+          ]++    deletePatternElems :: (ArrowXml a) => String -> String -> a XmlTree XmlTree+    deletePatternElems pattern name+        = choiceA+          [ isElemWithNameValue pattern name+            :->+            none+          , isRngGrammar+            :-> this+          , this+            :->+            processChildren ( deletePatternElems pattern name )+          ]+++-- ------------------------------------------------------------+++{-+- 4.19. define and ref elements+    - Remove any define element that is not reachable.+    - Now, for each element element that is not the child of a define element,+      add a define element to the grammar element,+      and replace the element element by a ref element referring+      to the added define element.+    - For each ref element that is expandable and is a descendant+      of a start element or an element element, expand it by replacing+      the ref element by the child of the define element to which it refers+    - This must not result in a loop.+    - Remove any define element whose child is not an element element.+-}+simplificationStep6 :: IOSArrow XmlTree XmlTree+simplificationStep6 =+  ( -- Remove any define element that is not reachable.+    (removeUnreachableDefines $<<< getAllDeepDefines+                                   &&&+                                   constA []+                                   &&&+                                   getRefsFromStartPattern+    )+    >>>+    -- for each element element that is not the child of a define element,+    -- add a define element to the grammar element,+    ( processElements False+      >>>+      processChildren (insertChildrenAt 1 (getRelaxParam "elementTable"))+    )+    >>>+    -- For each ref element that is expandable...+    -- Remove any define element whose child is not an element element+    (replaceExpandableRefs [] $< getExpandableDefines >>> deleteExpandableDefines)+  ) `when` collectErrors+  where+  replaceExpandableRefs :: RefList -> Env -> IOSArrow XmlTree XmlTree+  replaceExpandableRefs foundNames defTable+    = choiceA [+        isRngRef+             :-> (ifA ( getRngAttrName+                        >>>+                        isA (\name -> elem name (map fst foundNames))+                      )+                    -- we have found a loop if the name is in the list+                    (mkRelaxError "" $< ( getAttrValue defineOrigName+                                          >>>+                                          arr (\ n -> ( "Recursion in ref-Pattern: " +++                                                        formatStringListArr (reverse $ (n:) $ map snd foundNames)+                                                      )+                                              )+                                        )+                    )+                    (replaceRef $<< getRngAttrName &&& getAttrValue defineOrigName)+                 ),+        this :-> (processChildren $ replaceExpandableRefs foundNames defTable)+      ]+    where+    replaceRef :: NewName -> OldName -> IOSArrow XmlTree XmlTree+    replaceRef name oldname+      = ( constA (fromJust $ lookup name defTable)+          >>>+          getChildren+          >>>+          replaceExpandableRefs ((name,oldname):foundNames) defTable+        )+        `whenP`+        (const $ elem name $ map fst defTable)+++  processElements :: Bool -> IOSArrow XmlTree XmlTree+  processElements parentIsDefine+    = processChildren+      ( choiceA+        [ isRngElement+          :-> ( ifP (const parentIsDefine)+                (processElements False)+                ( processElements' $<< ( (incrSysVar theRelaxDefineId >>^ show)+                                         &&&+                                         getDefineName+                                       )+                )+              )+        , isRngDefine+          :-> processElements True+        , this+          :-> processElements False+        ])+    where+    getDefineName :: IOSArrow XmlTree String+    getDefineName+        = firstChild+          >>>+          fromLA createNameClass+          >>>+          arr show++    processElements' :: NewName -> OldName -> IOSArrow XmlTree XmlTree+    processElements' name oldname+      = storeElement name oldname+        >>>+        mkRngRef (createAttr name oldname) none++    storeElement :: NewName -> OldName -> IOSArrow XmlTree XmlTree+    storeElement name oldname+      = perform $+          ( mkRngDefine+             (createAttr name oldname) (processElements False)+          )+          &&&+          (listA $ getRelaxParam "elementTable")+          >>>+          arr2 (:)+          >>>+          setRelaxParam "elementTable"++    createAttr :: NewName -> OldName -> IOSArrow XmlTree XmlTree+    createAttr name oldname+      = mkAttr (mkName "name") (txt name)+        <+>+        mkAttr (mkName defineOrigName) (txt $ "created for element " ++ oldname)++  getExpandableDefines :: (ArrowXml a) => a XmlTree Env+  getExpandableDefines+    = listA $ (multi ( ( isRngDefine+                         >>>+                         getChildren+                         >>>+                         neg isRngElement+                       )+                       `guards`+                       this+                     )+              )+              >>>+              (getRngAttrName &&& this)++  deleteExpandableDefines :: (ArrowXml a) => a XmlTree XmlTree+  deleteExpandableDefines+    = processTopDown $ none+                       `when`+                       ( isRngDefine+                         >>>+                         getChildren+                         >>>+                         neg isRngElement+                       )+++-- ------------------------------------------------------------+++{-+- 4.20. notAllowed element+    - An attribute, list, group, interleave, or oneOrMore element that has+      a notAllowed child element is transformed into a notAllowed element.+    - A choice element that has two notAllowed child elements+      is transformed into a notAllowed element+    - A choice element that has one notAllowed child element+      is transformed into its other child element.+    - An except element that has a notAllowed child element is removed.+    - The preceding transformations are applied repeatedly+      until none of them is applicable any more.+    - Any define element that is no longer reachable is removed.+- 4.21. empty element+    - A group, interleave or choice element that has two empty child+      elements is transformed into an empty element.+    - A group or interleave element that has one empty child element+      is transformed into its other child element.+    - A choice element whose second child element is an empty element+      is transformed by interchanging its two child elements.+    - A oneOrMore element that has an empty child element+      is transformed into an empty element.+    - The preceding transformations are applied repeatedly+      until none of them is applicable any more.+-}++simplificationStep7 :: IOSArrow XmlTree XmlTree+simplificationStep7+    = ( markTreeChanged 0                               -- 0 = no changes, 1 = changes performed+        >>>+        processTopDownWithAttrl+        ( ( -- An attribute, list, group, interleave, or oneOrMore element that has a+            -- notAllowed child element is transformed into a notAllowed element.+            ( ( mkRngNotAllowed none none+                >>>+                markTreeChanged 1+              )+              `whenNot`                                 -- keep all errors+              (deep isRngRelaxError)+            )+            `when`+            ( isAttributeListGroupInterleaveOneOrMore+              >>>+              getChildren+              >>>+              isRngNotAllowed+            )+          )+          >>>+          ( -- A choice element that has two notAllowed child elements is+            -- transformed into a notAllowed element+            ( mkRngNotAllowed none none+              >>>+              markTreeChanged 1+            )+            `when`+            ( isRngChoice+              >>>+              listA (getChildren >>> isRngNotAllowed)+              >>>+              isA (\s -> length s == 2)+            )+          )+          >>>+          ( -- A choice element that has one notAllowed child element is+            -- transformed into its other child element.+            ( getChildren >>> neg isRngNotAllowed+              >>>+              markTreeChanged 1+            )+            `when`+            ( isRngChoice >>> getChildren >>> isRngNotAllowed )+          )+          >>>+          ( -- An except element that has a notAllowed child element is removed.+            ( ( markTreeChanged 1+                >>>+                none+              )+              `whenNot`                  -- keep all errors+              deep isRngRelaxError+            )+            `when`+            ( isRngExcept >>> getChildren >>> isRngNotAllowed )+          )+          >>> -- transforming the empty pattern (4.21)+          ( -- A group, interleave or choice element that has two empty child elements+            -- is transformed into an empty element.+            ( mkRngEmpty none+              >>>+              markTreeChanged 1+            )+            `when`+            ( isChoiceGroupInterleave+              >>>+              listA (getChildren >>> isRngEmpty)+              >>>+              isA (\s -> length s == 2)+            )+          )+          >>>+          ( -- A group or interleave element that has one empty child element+            -- is transformed into its other child element.+            ( getChildren+              >>>+              neg isRngEmpty+              >>>+              markTreeChanged 1+            )+            `when`+            ( isGroupInterleave >>> getChildren >>> isRngEmpty )+          )+          >>>+          ( -- A choice element whose second child element is an empty element is transformed+            -- by interchanging its two child elements.+            changeChoiceChildren+            `when`+            ( isRngChoice >>> getChildren >>> isRngEmpty )+          )+          >>>+          ( -- A oneOrMore element that has an empty child element+            -- is transformed into an empty element.+            ( mkRngEmpty none+              >>>+              markTreeChanged 1+            )+            `when`+            ( isRngOneOrMore >>> getChildren >>> isRngEmpty )+          )+        )+        >>>+        -- The preceding transformations are applied repeatedly+        -- until none of them is applicable any more.+        ( simplificationStep7+          `when`+          hasTreeChanged+        )+      ) `when` collectErrors+    where+    changeChoiceChildren :: IOSArrow XmlTree XmlTree+    changeChoiceChildren+        = ( ( replaceChildren+              ( mkRngEmpty none+                <+>+                (getChildren >>> neg isRngEmpty)+              )+              >>>+              markTreeChanged 1+            )+            `when`+            ( single (getChildren >>> isElem)           -- first child not "empty" elem+              >>>+              neg isRngEmpty+            )+          )++hasTreeChanged  :: IOSArrow b Int+hasTreeChanged+    = getSysAttrInt 0 "rng:changeTree"+      >>>+      isA (== 1)++markTreeChanged :: Int -> IOSArrow b b+markTreeChanged i+    = perform (setSysAttrInt "rng:changeTree" i)++-- ------------------------------------------------------------+++simplificationStep8 :: IOSArrow XmlTree XmlTree+simplificationStep8                     -- Remove any define element that is not reachable.+    = ( ( removeUnreachableDefines $<<<+          ( getAllDeepDefines+            &&&+            constA []+            &&&+            getRefsFromStartPattern+          )+        )+        `when` collectErrors+      )+++-- ------------------------------------------------------------+++restrictionsStep2 :: IOSArrow XmlTree XmlTree+restrictionsStep2 =+  processTopDown (+    choiceA [+-- 7.1.1. attribute pattern, the following paths are prohibited:+--        attribute//(ref | attribute)+      isRngAttribute :->+        ( ( deep isRngRelaxError+            <+>+            ( mkRelaxError $<< (getChangesAttr+                                &&&+                                ( listA ( getChildren+                                          >>>+                                          deep isAttributeRef+                                          >>>+                                          (getName &&& getChangesAttr >>> arr2 (++))+                                        )+                                  >>>+                                  arr (\n -> formatStringListPatt n +++                                             "Pattern not allowed as descendent(s)" +++                                             " of a attribute-Pattern"+                                      )+                                )+                               )+            )+          )+          `when`+          ( getChildren >>> deep isAttributeRef )+        ),++-- 7.1.2. oneOrMore pattern, the following paths are prohibited:+--        oneOrMore//(group | interleave)//attribute+      isRngOneOrMore :->+        ( ( deep isRngRelaxError+            <+>+            ( mkRelaxError $<< (getChangesAttr+                                &&&+                                ( listA ( getChildren+                                          >>>+                                          deep isGroupInterleave+                                          >>>+                                          (getName &&& getChangesAttr >>> arr2 (++))+                                        )+                                  &&&+                                  getChangesAttr+                                  >>>+                                  arr2 (\ n c -> ( formatStringListPatt n +++                                                   "Pattern not allowed as descendent(s) " +++                                                   "of a oneOrMore-Pattern" +++                                                   (if null c then "" else " " ++ show c) +++                                                   " followed by an attribute descendent"+                                                 )+                                       )+                                )+                               )+            )+          )+          `when`+          ( getChildren >>> deep isGroupInterleave+            >>>+            getChildren >>> deep isRngAttribute+          )+        ),++-- 7.1.3. list pattern, the following paths are prohibited:+--        list//( list | ref | attribute | text | interleave)+      isRngList :->+        ( ( deep isRngRelaxError+            <+>+            ( mkRelaxError $<< (getChangesAttr+                                &&&+                                ( listA ( getChildren+                                          >>>+                                          deep isAttributeRefTextListInterleave+                                          >>>+                                          (getName &&& getChangesAttr >>> arr2 (++))+                                        )+                                  >>>+                                  arr (\n -> formatStringListPatt n +++                                             "Pattern not allowed as descendent(s) of a list-Pattern")+                                )+                               )+            )+          )+          `when`+          ( getChildren+            >>>+            deep isAttributeRefTextListInterleave+          )+        ),++-- 7.1.4. except in data pattern, the following paths are prohibited:+--        data/except//(attribute | ref | text | list | group | interleave | oneOrMore | empty)+      isRngData :->+        ( ( deep isRngRelaxError+            <+>+            ( mkRelaxError $<< (getChangesAttr+                                &&&+                                ( listA (getChildren+                                         >>>+                                         deep isAttributeRefTextListGroupInterleaveOneOrMoreEmpty+                                         >>>+                                         (getName &&& getChangesAttr >>> arr2 (++))+                                        )+                                  >>>+                                  arr (\n -> formatStringListPatt n +++                                             "Pattern not allowed as descendent(s) of a data/except-Pattern")+                                )+                               )+            )+          )+          `when`+          ( getChildren+            >>>+            isRngExcept+            >>>+            deep isAttributeRefTextListGroupInterleaveOneOrMoreEmpty+          )+        ),++-- 7.1.5. start element, the following paths are prohibited:+--        start//(attribute | data | value | text | list | group | interleave | oneOrMore | empty)+      isRngStart :->+        ( ( deep isRngRelaxError+            <+>+            ( mkRelaxError $<< (getChangesAttr+                                &&&+                                ( listA (getChildren+                                         >>>+                                         deep (checkElemName [ "attribute", "data", "value", "text", "list",+                                                               "group", "interleave", "oneOrMore", "empty"])+                                         >>>+                                         (getName &&& getChangesAttr >>> arr2 (++))+                                        )+                                  >>>+                                  arr (\n -> formatStringListPatt n +++                                             "Pattern not allowed as descendent(s) of a start-Pattern")+                                )+                               )+            )+          )+          `when`+          ( getChildren+            >>>+            deep (checkElemName [ "attribute", "data", "value", "text", "list",+                                  "group", "interleave", "oneOrMore", "empty"])+          )+        ),++        this :-> this+      ]+  ) `when` collectErrors+++-- ------------------------------------------------------------+++restrictionsStep3 :: IOSArrow XmlTree XmlTree+restrictionsStep3+    = processTopDown+      ( ( deep isRngRelaxError+          <+>+          ( mkRelaxError "" $<+            ( -- getRngAttrName+              ( getChildren >>> isRngName >>> getChildren >>> getText )+              >>>+              arr (\ n -> ( "Content of element " ++ show n ++ " contains a pattern that can match " +++                            "a child and a pattern that matches a single string"+                          )+                  )+            )+          )+        )+        `when`+        ( isRngElement+          >>>+          ( getChildren >>. (take 1 . reverse) )+          >>>+          getContentType >>> isA (== CTNone)+        )+      ) `when` collectErrors++++getContentType :: IOSArrow XmlTree ContentType+getContentType+    = choiceA+      [ isRngValue      :-> (constA CTSimple)+      , isRngData       :-> processData+      , isRngList       :-> (constA CTSimple)+      , isRngText       :-> (constA CTComplex)+      , isRngRef        :-> (constA CTComplex)+      , isRngEmpty      :-> (constA CTEmpty)+      , isRngAttribute  :-> processAttribute+      , isRngGroup      :-> processGroup+      , isRngInterleave :-> processInterleave+      , isRngOneOrMore  :-> processOneOrMore+      , isRngChoice     :-> processChoice+      ]+    where+    processData :: IOSArrow XmlTree ContentType+    processData+        = ifA (neg (getChildren >>> isRngExcept))+          (constA CTSimple)+          ( getChildren+            >>>+            isRngExcept+            >>>+            getChildren+            >>>+            getContentType+            >>>+            ifP (/= CTNone) (constA CTSimple) (constA CTNone)+          )+    processAttribute :: IOSArrow XmlTree ContentType+    processAttribute+        = ifA ( lastChild+                >>>+                getContentType+                >>>+                isA (/= CTNone)+              )+          (constA CTEmpty)+          (constA CTNone)++    processGroup :: IOSArrow XmlTree ContentType+    processGroup+        = get2ContentTypes+          >>>+          arr2 (\a b -> if isGroupable a b then max a b else CTNone)++    processInterleave :: IOSArrow XmlTree ContentType+    processInterleave+        = get2ContentTypes+          >>>+          arr2 (\a b -> if isGroupable a b then max a b else CTNone)++    processOneOrMore :: IOSArrow XmlTree ContentType+    processOneOrMore+        = ifA ( getChildren+                >>>+                getContentType >>> isA (/= CTNone)+                >>>+                isA (\t -> isGroupable t t)+              )+          ( getChildren >>> getContentType )+          ( constA CTNone )++    processChoice :: IOSArrow XmlTree ContentType+    processChoice+        = get2ContentTypes+          >>>+          arr2 max++    isGroupable :: ContentType -> ContentType -> Bool+    isGroupable CTEmpty   _         = True+    isGroupable _         CTEmpty   = True+    isGroupable CTComplex CTComplex = True+    isGroupable _         _         = False+++checkPattern :: IOSArrow (XmlTree, ([NameClass], [NameClass])) XmlTree+checkPattern+    = (\ (_, (a, b)) -> isIn a b) `guardsP` (arr fst)+    where+    isIn :: [NameClass] -> [NameClass] -> Bool+    isIn _ []      = False+    isIn [] _      = False+    isIn (x:xs) ys = (any (overlap x) ys) || isIn xs ys+++occur :: String -> IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree+occur name fct+    = choiceA+      [ ( isElem >>> hasRngName name )+        :->+        fct+      , isChoiceGroupInterleaveOneOrMore+        :->+        (getChildren >>> occur name fct)+      ]++get2ContentTypes :: IOSArrow XmlTree (ContentType, ContentType)+get2ContentTypes+    = ( ( firstChild >>> getContentType )+        &&&+        ( lastChild  >>> getContentType )+      )++-- ------------------------------------------------------------+++-- Duplicate attributes are not allowed. -> fertig+-- Attributes using infinite name classes must be repeated; an attribute element that+-- has an anyName or nsName descendant element must have a oneOrMore ancestor element. -> fertig++-- berechnet alle define-Namen (fuer ref-Pattern) und Nameclasses der element-Pattern++restrictionsStep4 :: IOSArrow XmlTree XmlTree+restrictionsStep4+    = ( restrictionsStep4' $<+        listA ( deep isRngDefine                                -- get all defines+                >>>+                ( getRngAttrName                                -- get define name+                  &&&+                  ( single ( getChildren+                             >>>+                             getChildren+                             >>>+                             fromLA createNameClass             -- compute the name class from 1. grandchild+                           )+                    `orElse`+                    (constA AnyName)+                  )+                )+              )+      ) `when` collectErrors++restrictionsStep4' :: [(String, NameClass)] -> IOSArrow XmlTree XmlTree+restrictionsStep4' nc =+  processTopDown (+    (+      ( deep isRngRelaxError+        <+>+        ( mkRelaxError "" $<+          ( getRngAttrName+            >>>+            arr (\ n -> ( "Both attribute-pattern occuring in an " +++                          show n ++ " belong to the same name-class"+                        )+                )+          )+        )+      )+      `when`+      ( (isRngGroup `orElse` isRngInterleave)+        >>>+        ( getChildren+          &&&+          ( firstChild+            >>>+            listA ( occur "attribute" (single getChildren)+                    >>>+                    fromLA createNameClass+                  )+          )+          &&&+          ( lastChild+            >>>+            listA ( occur "attribute" (single getChildren)+                    >>>+                    fromLA createNameClass+                  )+          )+        )+        >>> checkPattern+      )+    )+    >>>+    (+      ( deep isRngRelaxError+        <+>+        ( mkRelaxError ""+          ( "An attribute that has an anyName or nsName descendant element " +++            "must have a oneOrMore ancestor element"+          )+        )+      )+      `when`+      (isRngElement >>> checkInfiniteAttribute)+    )+    >>>+    ( ( deep isRngRelaxError+        <+>+        ( mkRelaxError ""+          ( "Both element-pattern occuring in an interleave " +++            "belong to the same name-class"+          )+        )+      )+      `when`+      ( isRngInterleave+        >>>+        ( getChildren+          &&&+          (firstChild >>> listA (occur "ref" this >>> getRngAttrName))+          &&&+          (lastChild  >>> listA (occur "ref" this >>> getRngAttrName))+        )+        >>>+        checkNames+      )+    )+    >>>+    ( ( deep isRngRelaxError+        <+>+        ( mkRelaxError "" "A text pattern must not occur in both children of an interleave" )+      )+      `when`+      (isRngInterleave >>> checkText)+    )+  )+  where+  checkInfiniteAttribute :: IOSArrow XmlTree XmlTree+  checkInfiniteAttribute+    = getChildren+      >>>+      choiceA+      [ isRngOneOrMore :-> none+      , ( isRngAttribute+          >>>+          deep (isRngAnyName `orElse` isRngNsName)+        ) :-> this+      , this :-> checkInfiniteAttribute+      ]++  checkNames :: IOSArrow (XmlTree, ([String], [String])) XmlTree+  checkNames = (arr fst)+               &&&+               (arr (\(_, (a, _)) -> getNameClasses nc a))+               &&&+               (arr (\(_, (_, b)) -> getNameClasses nc b))+               >>>+               checkPattern+    where+    getNameClasses :: [(String, NameClass)] -> [String] -> [NameClass]+    getNameClasses nc' l = map (\x -> fromJust $ lookup x nc') l++  checkText :: IOSArrow XmlTree XmlTree+  checkText+      = ( firstChild >>> occur "text" this )+        `guards`+        ( lastChild  >>> occur "text" this )++-- ------------------------------------------------------------+++overlap         :: NameClass -> NameClass -> Bool+overlap nc1 nc2+    = any (bothContain nc1 nc2) (representatives nc1 ++ representatives nc2)++bothContain     :: NameClass -> NameClass -> QName -> Bool+bothContain nc1 nc2 qn+    = contains nc1 qn && contains nc2 qn++illegalLocalName        :: LocalName+illegalLocalName        = ""++illegalUri              :: Uri+illegalUri              = "\x1"++representatives         :: NameClass -> [QName]+representatives AnyName+    = [mkQName "" illegalLocalName illegalUri]++representatives (AnyNameExcept nc)+    = (mkQName "" illegalLocalName illegalUri) : (representatives nc)++representatives (NsName ns)+    = [mkQName "" illegalLocalName ns]++representatives (NsNameExcept ns nc)+    = (mkQName "" illegalLocalName ns) : (representatives nc)++representatives (Name ns ln)+    = [mkQName "" ln ns]++representatives (NameClassChoice nc1 nc2)+    = (representatives nc1) ++ (representatives nc2)++representatives _+    = []++-- -------------------------------------------------------------------------------------------------------++resetStates :: IOSArrow XmlTree XmlTree+resetStates+    = ( perform (constA 0  >>> setSysVar theRelaxDefineId)+        >>>+        perform (constA 0  >>> setSysVar theRelaxNoOfErrors)+        >>>+        perform (constA [] >>> setRelaxParam "elementTable" )+      )+++getAllDeepDefines :: IOSArrow XmlTree Env+getAllDeepDefines+    = listA $ deep isRngDefine+      >>>+      ( getRngAttrName &&& this )+++-- | Return all reachable defines from the start pattern++getRefsFromStartPattern :: IOSArrow XmlTree [String]+getRefsFromStartPattern+  = listA+    ( getChildren+      >>>+      isRngGrammar+      >>>+      getChildren+      >>>+      isRngStart+      >>>+      deep isRngRef+      >>>+      getRngAttrName+    )++removeUnreachableDefines :: Env -> [String] -> [String] -> IOSArrow XmlTree XmlTree+removeUnreachableDefines allDefs processedDefs reachableDefs+    = ifP (const $ unprocessedDefs /= [])+      ( removeUnreachableDefines allDefs (nextTreeName : processedDefs) $< newReachableDefs )+      ( processChildren $ -- root node+        processChildren $ -- first grammar+        ( none+          `when`+          ( isRngDefine+            >>>+            getRngAttrName+            >>>+            isA (\n -> not $ elem n reachableDefs)+          )+        )+      )+    where+    unprocessedDefs :: [String]+    unprocessedDefs+        = reachableDefs \\ processedDefs++    newReachableDefs :: IOSArrow n [String]+    newReachableDefs+        = constA getTree+          >>>+          listA ( deep isRngRef+                  >>>+                  getRngAttrName+                )+          >>>+          arr (noDoubles . (reachableDefs ++))++    getTree :: XmlTree+    getTree+        = fromJust $ lookup nextTreeName allDefs++    nextTreeName :: String+    nextTreeName+        = head unprocessedDefs+++-- -------------------------------------------------------------------------------------------------------+++checkElemName :: [String] -> IOSArrow XmlTree XmlTree+checkElemName l+    = ( isElem >>> getLocalPart >>> isA (\s -> elem s l) )+      `guards`+      this++wrapPattern2Two :: (ArrowXml a) => String -> a XmlTree XmlTree+wrapPattern2Two name+  = choiceA+    [ noOfChildren (> 2)+      :-> ( replaceChildren ( (mkRngElement name none+                               (getChildren >>. take 2)+                              )+                              <+>+                              (getChildren >>. drop 2)+                            )+            >>>+            wrapPattern2Two name+          )+    , noOfChildren (== 1)+      :-> getChildren+    , this+      :-> this+    ]++mkRelaxError :: String -> String -> IOSArrow n XmlTree+mkRelaxError changesStr errStr+  = perform (constA 1 >>> chgSysVar theRelaxNoOfErrors (+))+    >>>+    mkRngRelaxError none none+    >>>+    addAttr "desc" errStr+    >>>+    ( addAttr "changes" changesStr+      `whenP`+      (const $ changesStr /= "")+    )++collectErrors :: IOSArrow XmlTree XmlTree+collectErrors+  = none+    `when`+    ( (getSysVar theRelaxCollectErrors >>> isA not)+      >>>+      (getSysVar theRelaxNoOfErrors    >>> isA (>0))+    )++-- | Returns the list of simplification errors or 'none'+getErrors :: IOSArrow XmlTree XmlTree+getErrors = (getSysVar theRelaxNoOfErrors >>> isA (>0))+            `guards`+            (root [] [multi isRngRelaxError])++setChangesAttr :: String -> IOSArrow XmlTree XmlTree+setChangesAttr str+  = ifA (hasAttr a_relaxSimplificationChanges)+      ( processAttrl $+          changeAttrValue (++ (", " ++ str))+          `when`+          (hasRngName a_relaxSimplificationChanges)+      )+      (mkAttr (mkName a_relaxSimplificationChanges) (txt str))+++getChangesAttr :: IOSArrow XmlTree String+getChangesAttr+  = getAttrValue a_relaxSimplificationChanges+    &&&+    getSysAttr a_output_changes+    >>>+    ifP (\(changes, param) -> changes /= "" && param == "1")+      (arr2 $ \l _ -> " (" ++ l ++ ")")+      (constA "")++-- -------------------------------------------------------------------------------------------------------++-- | Creates the simple form of a Relax NG schema+-- (see also: 'relaxOptions')++createSimpleForm :: Bool -> Bool -> Bool -> IOSArrow XmlTree XmlTree+createSimpleForm checkRestrictions validateExternalRef validateInclude+    = traceMsg 2 ("createSimpleForm: " ++ show (checkRestrictions,validateExternalRef, validateInclude))+      >>>+      ( if checkRestrictions+        then createSimpleWithRest+        else createSimpleWithoutRest+      )+    where++    createSimpleWithRest :: IOSArrow XmlTree XmlTree+    createSimpleWithRest+        = seqA $ concat [ simplificationPart1+                        , return $ traceDoc "relax NG: simplificationPart1 done"+                        , restrictionsPart1+                        , return $ traceDoc "relax NG: restrictionsPart1 done"+                        , simplificationPart2+                        , return $ traceDoc "relax NG simplificationPart2 done"+                        , restrictionsPart2+                        , return $ traceDoc "relax NG: restrictionsPart2 done"+                        , finalCleanUp+                        , return $ traceDoc "relax NG: finalCleanUp done"+                        ]++    createSimpleWithoutRest :: IOSArrow XmlTree XmlTree+    createSimpleWithoutRest+        = seqA $ concat [ simplificationPart1+                        , simplificationPart2+                        , finalCleanUp+                        ]+    simplificationPart1 :: [IOSArrow XmlTree XmlTree]+    simplificationPart1+        = [ propagateNamespaces+          , simplificationStep1+          , simplificationStep2 validateExternalRef validateInclude [] []+          , simplificationStep3+          , simplificationStep4+          ]++    simplificationPart2 :: [IOSArrow XmlTree XmlTree]+    simplificationPart2+        = [ simplificationStep5+          , simplificationStep6+          , simplificationStep7+          , simplificationStep8+          ]++    restrictionsPart1 :: [IOSArrow XmlTree XmlTree]+    restrictionsPart1+        = [ restrictionsStep1 ]++    restrictionsPart2 :: [IOSArrow XmlTree XmlTree]+    restrictionsPart2+        = [ restrictionsStep2+          , restrictionsStep3+          , restrictionsStep4+          ]++    finalCleanUp :: [IOSArrow XmlTree XmlTree]+    finalCleanUp+        = [ cleanUp+          , resetStates+          ]++    cleanUp :: IOSArrow XmlTree XmlTree+    cleanUp = processTopDown $+              removeAttr a_relaxSimplificationChanges+              >>>+              removeAttr defineOrigName++-- -------------------------------------------------------------------------------------------------------++setRelaxParam           :: String -> IOStateArrow s XmlTrees XmlTree+setRelaxParam n         = chgSysVar theRelaxAttrList (addEntry n)+                          >>>+                          arrL id++getRelaxParam           :: String -> IOStateArrow s b XmlTree+getRelaxParam n         = getSysVar theRelaxAttrList+                          >>>+                          arrL (lookup1 n)++-- -------------------------------------------------------------------------------------------------------
+ src/Text/XML/HXT/RelaxNG/SystemConfig.hs view
@@ -0,0 +1,94 @@+-- ------------------------------------------------------------++{- |+   Module     : Text.XML.HXT.RelaxNG+   Copyright  : Copyright (C) 2010 Uwe Schmidt, Torben Kuseler+   License    : MIT++   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+   Stability  : stable+   Portability: portable++   This helper module exports elements from the basic Relax NG libraries:+   Validator, CreatePattern, PatternToString and DataTypes.+   It is the main entry point to the Relax NG schema validator of the Haskell+   XML Toolbox.++-}++-- ------------------------------------------------------------++module   Text.XML.HXT.RelaxNG.SystemConfig+where++import Text.XML.HXT.Arrow.XmlState.TypeDefs+import Text.XML.HXT.Arrow.XmlOptions++import Text.XML.HXT.RelaxNG.Validator           ( validateDocumentWithRelaxSchema )+++import System.Console.GetOpt++-- ------------------------------------------------------------++withRelaxNG                     :: String -> SysConfig+withRelaxNG s                   = setS (theRelaxValidate+					.&&&. theRelaxSchema+					.&&&. theRelaxValidator+				       ) (True, (s, validateDocumentWithRelaxSchema [] s))++withRelaxCheckRestr             ::  Bool -> SysConfig+withRelaxCheckRestr             = setS theRelaxCheckRestr++withRelaxValidateExtRef         :: Bool -> SysConfig+withRelaxValidateExtRef         = setS theRelaxValidateExtRef++withRelaxValidateInclude        :: Bool -> SysConfig+withRelaxValidateInclude        = setS theRelaxValidateInclude++withRelaxCollectErrors          :: Bool -> SysConfig+withRelaxCollectErrors          = setS theRelaxCollectErrors++-- ------------------------------------------------------------++-- | available Relax NG validation options+--+-- defines options+-- 'a_check_restrictions', 'a_validate_externalRef', 'a_validate_include', 'a_do_not_check_restrictions',+-- 'a_do_not_validate_externalRef', 'a_do_not_validate_include'++relaxOptions :: [OptDescr SysConfig]+relaxOptions+    = [ Option "X" [a_relax_schema]                     (ReqArg withRelaxNG             "SCHEMA")  "validation with Relax NG, SCHEMA is the URI for the Relax NG schema"+      , Option ""  [a_check_restrictions]               (NoArg (withRelaxCheckRestr        True))  "check Relax NG schema restrictions during schema simplification (default)"+      , Option ""  [a_do_not_check_restrictions]        (NoArg (withRelaxCheckRestr       False))  "do not check Relax NG schema restrictions"+      , Option ""  [a_validate_externalRef]             (NoArg (withRelaxValidateExtRef    True))  "validate a Relax NG schema referenced by a externalRef-Pattern (default)"+      , Option ""  [a_do_not_validate_externalRef]      (NoArg (withRelaxValidateExtRef   False))  "do not validate a Relax NG schema referenced by an externalRef-Pattern"+      , Option ""  [a_validate_include]                 (NoArg (withRelaxValidateInclude   True))  "validate a Relax NG schema referenced by an include-Pattern (default)"+      , Option ""  [a_do_not_validate_include]          (NoArg (withRelaxValidateInclude  False))   "do not validate a Relax NG schema referenced by an include-Pattern"+      , Option ""  [a_collect_errors]                   (NoArg (withRelaxCollectErrors     True))   "collect errors, default"+      , Option ""  [a_do_not_collect_errors]            (NoArg (withRelaxCollectErrors    False))   "do not collect errors"+      ]++-- ------------------------------------------------------------+-- option for Relax NG++a_relax_schema,+ a_do_not_check_restrictions,+ a_check_restrictions,+ a_do_not_validate_externalRef,+ a_validate_externalRef,+ a_do_not_validate_include,+ a_validate_include,+ a_do_not_collect_errors :: String++a_relax_schema                = "relax-schema"+a_do_not_check_restrictions   = "do-not-check-restrictions"+a_check_restrictions          = "check-restrictions"+a_do_not_validate_externalRef = "do-not-validate-externalRef"+a_validate_externalRef        = "validate-externalRef"+a_do_not_validate_include     = "do-not-validate-include"+a_validate_include            = "validate-include"+a_do_not_collect_errors       = "do-not-collect-errors"++-- ------------------------------------------------------------
+ src/Text/XML/HXT/RelaxNG/Utils.hs view
@@ -0,0 +1,161 @@+-- ------------------------------------------------------------++{- |+   Module     : Text.XML.HXT.RelaxNG.Utils+   Copyright  : Copyright (C) 2008 Uwe Schmidt+   License    : MIT++   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+   Stability  : stable+   Portability: portable++   Helper functions for RelaxNG validation++-}++-- ------------------------------------------------------------++module Text.XML.HXT.RelaxNG.Utils+    ( isRelaxAnyURI+    , compareURI+    , normalizeURI+    , isNumber+    , isNmtoken+    , isName+    , formatStringList+    , formatStringListPatt+    , formatStringListId+    , formatStringListQuot+    , formatStringListPairs+    , formatStringListArr+    )+where++import Text.ParserCombinators.Parsec++import Text.XML.HXT.Parser.XmlTokenParser+    ( skipS0+    , nmtoken+    , name+    )++import Network.URI+    ( isURI+    , isRelativeReference+    , parseURI+    , URI(..)+    )++import Data.Maybe+    ( fromMaybe+    )++import Data.Char+    ( toLower+    )+++-- ------------------------------------------------------------+++-- | Tests whether a URI matches the Relax NG anyURI symbol++isRelaxAnyURI :: String -> Bool+isRelaxAnyURI s+    = s == "" ||+      ( isURI s && not (isRelativeReference s) &&+        ( let (URI _ _ path _ frag) = fromMaybe (URI "" Nothing "" "" "") $ parseURI s+          in (frag == "" && path /= "")+        )+      )+++-- | Tests whether two URIs are equal after 'normalizeURI' is performed++compareURI :: String -> String -> Bool+compareURI uri1 uri2+    = normalizeURI uri1 == normalizeURI uri2+++-- |  Converts all letters to the corresponding lower-case letter+-- and removes a trailing \"\/\"++normalizeURI :: String -> String+normalizeURI ""+    = ""+normalizeURI uri+    = map toLower ( if last uri == '/'+                    then init uri+                    else uri+                  )++checkByParsing  :: Parser String -> String -> Bool+checkByParsing p s+    = either (const False) (const True) (parse p' "" s)+      where+      p' = do+           r <- p+           eof+           return r++-- | Tests whether a string matches a number [-](0-9)*+isNumber :: String -> Bool+isNumber+    = checkByParsing parseNumber'+    where+    parseNumber' :: Parser String+    parseNumber'+        = do+          skipS0+          m <- option "" (string "-")+          n <- many1 digit+          skipS0+          return $ m ++ n++isNmtoken       :: String -> Bool+isNmtoken    = checkByParsing nmtoken++isName  :: String -> Bool+isName  = checkByParsing name++{- |++Formats a list of strings into a single string.+The first parameter formats the elements, the 2. is inserted+between two elements.++example:++> formatStringList show ", " ["foo", "bar", "baz"] -> "foo", "bar", "baz"++-}++formatStringListPatt :: [String] -> String+formatStringListPatt+    = formatStringList (++ "-") ", "++formatStringListPairs :: [(String,String)] -> String+formatStringListPairs+    = formatStringList id ", "+      . map (\ (a, b) -> a ++ " = " ++ show b)++formatStringListQuot :: [String] -> String+formatStringListQuot+    = formatStringList show ", "++formatStringListId :: [String] -> String+formatStringListId+    = formatStringList id ", "++formatStringListArr :: [String] -> String+formatStringListArr+    = formatStringList show " -> "++formatStringList :: (String -> String) -> String -> [String] -> String+formatStringList _sf _sp []+    = ""+formatStringList sf spacer l+    = reverse $ drop (length spacer) $ reverse $+      foldr (\e -> ((if e /= "" then sf e ++ spacer else "") ++)) "" l++-- ----------------------------------------
+ src/Text/XML/HXT/RelaxNG/Validation.hs view
@@ -0,0 +1,596 @@+-- ------------------------------------------------------------++{- |+   Module     : Text.XML.HXT.RelaxNG.Validation+   Copyright  : Copyright (C) 2008 Torben Kuseler, Uwe Schmidt+   License    : MIT++   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+   Stability  : stable+   Portability: portable++   Validation of a XML document with respect to a valid Relax NG schema in simple form.+   Copied and modified from \"An algorithm for RELAX NG validation\" by James Clark+   (<http://www.thaiopensource.com/relaxng/derivative.html>).++-}++-- ------------------------------------------------------------++module Text.XML.HXT.RelaxNG.Validation+    ( validateWithRelaxAndHandleErrors+    , validateDocWithRelax+    , validateRelax+    , readForRelax+    , normalizeForRelaxValidation+    , contains+    )+where++import           Control.Arrow.ListArrows++import           Data.Char.Properties.XMLCharProps      ( isXmlSpaceChar )+import           Data.Maybe                             ( fromJust )++import           Text.XML.HXT.DOM.Interface+import qualified Text.XML.HXT.DOM.XmlNode as XN++import           Text.XML.HXT.Arrow.XmlArrow+import           Text.XML.HXT.Arrow.Edit                ( canonicalizeAllNodes+                                                        , collapseAllXText+                                                        )++import           Text.XML.HXT.Arrow.ProcessDocument     ( propagateAndValidateNamespaces+                                                        , getDocumentContents+                                                        , parseXmlDocument+                                                        )+import           Text.XML.HXT.Arrow.XmlState+import           Text.XML.HXT.Arrow.XmlState.TypeDefs++import           Text.XML.HXT.RelaxNG.DataTypes+import           Text.XML.HXT.RelaxNG.CreatePattern+import           Text.XML.HXT.RelaxNG.PatternToString+import           Text.XML.HXT.RelaxNG.DataTypeLibraries+import           Text.XML.HXT.RelaxNG.Utils             ( formatStringListQuot+                                                        , compareURI+                                                        )++{-+import qualified Debug.Trace as T+-}++-- ------------------------------------------------------------++validateWithRelaxAndHandleErrors        :: IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree+validateWithRelaxAndHandleErrors theSchema+    = validateWithRelax theSchema+      >>>+      handleErrors++validateWithRelax       :: IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree+validateWithRelax theSchema+    = traceMsg 2 "validate with Relax NG schema"+      >>>+      ( ( normalizeForRelaxValidation           -- prepare the document for validation+          >>>+          getChildren+          >>>+          isElem                                -- and select the root element+        )+        &&&+        theSchema+      )+      >>>+      arr2A validateRelax                       -- compute vaidation errors as a document++handleErrors    :: IOSArrow XmlTree XmlTree+handleErrors+    = traceDoc "error found when validating with Relax NG schema"+      >>>+      ( getChildren                             -- prepare error format+        >>>+        getText+        >>>+        arr ("Relax NG validation: " ++)+        >>>+        mkError c_err+      )+      >>>+      filterErrorMsg                            -- issue errors and set system status+++{- |+   normalize a document for validation with Relax NG: remove all namespace declaration attributes,+   remove all processing instructions and merge all sequences of text nodes into a single text node+-}++normalizeForRelaxValidation :: ArrowXml a => a XmlTree XmlTree+normalizeForRelaxValidation+  = processTopDownWithAttrl+    (+     ( none `when`                      -- remove all namespace attributes+       ( isAttr+         >>>+         getNamespaceUri+         >>>+         isA (compareURI xmlnsNamespace)+       )+     )+     >>>+     (none `when` isPi)                 -- processing instructions+    )+    >>>+    collapseAllXText                    -- all text node sequences are merged into a single text node++-- ------------------------------------------------------------++{- | Validates a xml document with respect to a Relax NG schema++   * 1.parameter  :  the arrow for computing the Relax NG schema++   - 2.parameter  :  list of configuration options for reading and validating++   - 3.parameter  :  XML document URI++   - arrow-input  :  ignored++   - arrow-output :  list of errors or 'none'+-}++validateDocWithRelax :: IOSArrow XmlTree XmlTree -> SysConfigList -> String -> IOSArrow XmlTree XmlTree+validateDocWithRelax theSchema config doc+    = localSysEnv+      $+      configSysVars config+      >>>+      ( if null doc+        then root [] []+        else readForRelax doc+      )+      >>>+      validateWithRelax theSchema+      >>>+      perform handleErrors+++{- | Validates a xml document with respect to a Relax NG schema++   * 1.parameter  :  XML document++   - arrow-input  :  Relax NG schema++   - arrow-output :  list of errors or 'none'+-}++validateRelax :: XmlTree -> IOSArrow XmlTree XmlTree+validateRelax xmlDoc+  = fromLA+    ( createPatternFromXmlTree+      >>>+      arr (\p -> childDeriv ("",[]) p xmlDoc)+      >>>+      ( (not . nullable)+        `guardsP`+        root [] [ (take 1024 . show) ^>> mkText ]       -- pattern may be recursive, so the string representation+                                                        -- is truncated to 1024 chars to assure termination+      )+    )++-- ------------------------------------------------------------++readForRelax    :: String -> IOSArrow b XmlTree+readForRelax schema+    = getDocumentContents schema+      >>>+      parseXmlDocument False+      >>>+      canonicalizeAllNodes+      >>>+      propagateAndValidateNamespaces++-- ------------------------------------------------------------+--+-- | tests whether a 'NameClass' contains a particular 'QName'++contains :: NameClass -> QName -> Bool+contains AnyName _                      = True+contains (AnyNameExcept nc)    n        = not (contains nc n)+contains (NsName ns1)          qn       = ns1 == namespaceUri qn+contains (NsNameExcept ns1 nc) qn       = ns1 == namespaceUri qn && not (contains nc qn)+contains (Name ns1 ln1)        qn       = (ns1 == namespaceUri qn) && (ln1 == localPart qn)+contains (NameClassChoice nc1 nc2) n    = (contains nc1 n) || (contains nc2 n)+contains (NCError _) _                  = False+++-- ------------------------------------------------------------+--+-- | tests whether a pattern matches the empty sequence+nullable:: Pattern -> Bool+nullable (Group p1 p2)          = nullable p1 && nullable p2+nullable (Interleave p1 p2)     = nullable p1 && nullable p2+nullable (Choice p1 p2)         = nullable p1 || nullable p2+nullable (OneOrMore p)          = nullable p+nullable (Element _ _)          = False+nullable (Attribute _ _)        = False+nullable (List _)               = False+nullable (Value _ _ _)          = False+nullable (Data _ _)             = False+nullable (DataExcept _ _ _)     = False+nullable (NotAllowed _)         = False+nullable Empty                  = True+nullable Text                   = True+nullable (After _ _)            = False+++-- ------------------------------------------------------------+--+-- | computes the derivative of a pattern with respect to a XML-Child and a 'Context'++childDeriv :: Context -> Pattern -> XmlTree -> Pattern++childDeriv cx p t+    | XN.isText t       = textDeriv cx p . fromJust . XN.getText $ t+    | XN.isElem t       = endTagDeriv p4+    | otherwise         = notAllowed "Call to childDeriv with wrong arguments"+    where+    children    =            XN.getChildren $ t+    qn          = fromJust . XN.getElemName $ t+    atts        = fromJust . XN.getAttrl    $ t+    cx1         = ("",[])+    p1          = startTagOpenDeriv p qn+    p2          = attsDeriv cx1 p1 atts+    p3          = startTagCloseDeriv p2+    p4          = childrenDeriv cx1 p3 children++-- ------------------------------------------------------------+--+-- | computes the derivative of a pattern with respect to a text node++textDeriv :: Context -> Pattern -> String -> Pattern++textDeriv cx (Choice p1 p2) s+    = choice (textDeriv cx p1 s) (textDeriv cx p2 s)++textDeriv cx (Interleave p1 p2) s+    = choice+      (interleave (textDeriv cx p1 s) p2)+      (interleave p1 (textDeriv cx p2 s))++textDeriv cx (Group p1 p2) s+    = let+      p = group (textDeriv cx p1 s) p2+      in+      if nullable p1+      then choice p (textDeriv cx p2 s)+      else p++textDeriv cx (After p1 p2) s+    = after (textDeriv cx p1 s) p2++textDeriv cx (OneOrMore p) s+    = group (textDeriv cx p s) (choice (OneOrMore p) Empty)++textDeriv _ Text _+    = Text++textDeriv cx1 (Value (uri, s) value cx2) s1+    = case datatypeEqual uri s value cx2 s1 cx1+      of+      Nothing     -> Empty+      Just errStr -> notAllowed errStr++textDeriv cx (Data (uri, s) params) s1+    = case datatypeAllows uri s params s1 cx+      of+      Nothing     -> Empty+      Just errStr -> notAllowed2 errStr++textDeriv cx (DataExcept (uri, s) params p) s1+    = case (datatypeAllows uri s params s1 cx)+      of+      Nothing     -> if not $ nullable $ textDeriv cx p s1+                     then Empty+                     else notAllowed+                              ( "Any value except " +++                                show (show p) +++                                " expected, but value " +++                                show (show s1) +++                                " found"+                              )+      Just errStr -> notAllowed errStr++textDeriv cx (List p) s+    = if nullable (listDeriv cx p (words s))+      then Empty+      else notAllowed+               ( "List with value(s) " +++                 show p +++                 " expected, but value(s) " +++                 formatStringListQuot (words s) +++                 " found"+               )++textDeriv _ n@(NotAllowed _) _+    = n++textDeriv _ p s+    = notAllowed+      ( "Pattern " ++ show (getPatternName p) +++        " expected, but text " ++ show s ++ " found"+      )+++-- ------------------------------------------------------------+--+-- | To compute the derivative of a pattern with respect to a list of strings,+-- simply compute the derivative with respect to each member of the list in turn.++listDeriv :: Context -> Pattern -> [String] -> Pattern++listDeriv _ p []+    = p++listDeriv cx p (x:xs)+    = listDeriv cx (textDeriv cx p x) xs+++-- ------------------------------------------------------------+--+-- | computes the derivative of a pattern with respect to a start tag open++startTagOpenDeriv :: Pattern -> QName -> Pattern++startTagOpenDeriv (Choice p1 p2) qn+    = choice (startTagOpenDeriv p1 qn) (startTagOpenDeriv p2 qn)++startTagOpenDeriv (Element nc p) qn+    | contains nc qn+        = after p Empty+    | otherwise+        = notAllowed $+          "Element with name " ++ nameClassToString nc +++            " expected, but " ++ universalName qn ++ " found"++startTagOpenDeriv (Interleave p1 p2) qn+    = choice+      (applyAfter (flip interleave p2) (startTagOpenDeriv p1 qn))+      (applyAfter (interleave p1) (startTagOpenDeriv p2 qn))++startTagOpenDeriv (OneOrMore p) qn+    = applyAfter+      (flip group (choice (OneOrMore p) Empty))+      (startTagOpenDeriv p qn)++startTagOpenDeriv (Group p1 p2) qn+    = let+      x = applyAfter (flip group p2) (startTagOpenDeriv p1 qn)+      in+      if nullable p1+      then choice x (startTagOpenDeriv p2 qn)+      else x++startTagOpenDeriv (After p1 p2) qn+    = applyAfter (flip after p2) (startTagOpenDeriv p1 qn)++startTagOpenDeriv n@(NotAllowed _) _+    = n++startTagOpenDeriv p qn+    = notAllowed ( show p ++ " expected, but Element " ++ universalName qn ++ " found" )++-- ------------------------------------------------------------++-- auxiliary functions for tracing+{-+attsDeriv' cx p ts+    = T.trace ("attsDeriv: p=" ++ (take 1000 . show) p ++ ", t=" ++ showXts ts) $+      T.trace ("res= " ++ (take 1000 . show) res) res+    where+    res = attsDeriv cx p ts++attDeriv' cx p t+    = T.trace ("attDeriv: p=" ++ (take 1000 . show) p ++ ", t=" ++ showXts [t]) $+      T.trace ("res= " ++ (take 1000 . show) res) res+    where+    res = attDeriv cx p t+-}++-- | To compute the derivative of a pattern with respect to a sequence of attributes,+-- simply compute the derivative with respect to each attribute in turn.++attsDeriv :: Context -> Pattern -> XmlTrees -> Pattern++attsDeriv _ p []+    = p+attsDeriv cx p (t : ts)+    | XN.isAttr t+        = attsDeriv cx (attDeriv cx p t) ts+    | otherwise+        = notAllowed "Call to attsDeriv with wrong arguments"++attDeriv :: Context -> Pattern -> XmlTree -> Pattern++attDeriv cx (After p1 p2) att+    = after (attDeriv cx p1 att) p2++attDeriv cx (Choice p1 p2) att+    = choice (attDeriv cx p1 att) (attDeriv cx p2 att)++attDeriv cx (Group p1 p2) att+    = choice+      (group (attDeriv cx p1 att) p2)+      (group p1 (attDeriv cx p2 att))++attDeriv cx (Interleave p1 p2) att+    = choice+      (interleave (attDeriv cx p1 att) p2)+      (interleave p1 (attDeriv cx p2 att))++attDeriv cx (OneOrMore p) att+    = group+      (attDeriv cx p att)+      (choice (OneOrMore p) Empty)++attDeriv cx (Attribute nc p) att+    | isa+      &&+      not (contains nc qn)+        = notAllowed1 $+          "Attribute with name " ++ nameClassToString nc+          ++ " expected, but " ++ universalName qn ++ " found"+    | isa+      &&+      ( ( nullable p+          &&+          whitespace val+        )+        || nullable p'+      )+        = Empty+    | isa+        = err' p'+    where+    isa =            XN.isAttr      $ att+    qn  = fromJust . XN.getAttrName $ att+    av  =            XN.getChildren $ att+    val = showXts av+    p'  = textDeriv cx p val++    err' (NotAllowed (ErrMsg _l es))+        = err'' (": " ++ head es)+    err' _+        = err'' ""+    err'' e+        = notAllowed2 $+          "Attribute value \"" ++ val +++          "\" does not match datatype spec " ++ show p ++ e++attDeriv _ n@(NotAllowed _) _+    = n++attDeriv _ _p att+    = notAllowed $+      "No matching pattern for attribute '" ++  showXts [att] ++ "' found"++-- ------------------------------------------------------------+--+-- | computes the derivative of a pattern with respect to a start tag close++startTagCloseDeriv :: Pattern -> Pattern++startTagCloseDeriv (After p1 p2)+    = after (startTagCloseDeriv p1) p2++startTagCloseDeriv (Choice p1 p2)+    = choice+      (startTagCloseDeriv p1)+      (startTagCloseDeriv p2)++startTagCloseDeriv (Group p1 p2)+    = group+      (startTagCloseDeriv p1)+      (startTagCloseDeriv p2)++startTagCloseDeriv (Interleave p1 p2)+    = interleave+      (startTagCloseDeriv p1)+      (startTagCloseDeriv p2)++startTagCloseDeriv (OneOrMore p)+    = oneOrMore (startTagCloseDeriv p)++startTagCloseDeriv (Attribute nc _)+    = notAllowed1 $+      "Attribut with name, " ++ show nc +++      " expected, but no more attributes found"++startTagCloseDeriv p+    = p+++-- ------------------------------------------------------------+--+-- | Computing the derivative of a pattern with respect to a list of children involves+-- computing the derivative with respect to each pattern in turn, except+-- that whitespace requires special treatment.++childrenDeriv :: Context -> Pattern -> XmlTrees -> Pattern+childrenDeriv _cx p@(NotAllowed _) _+    = p++childrenDeriv cx p []+    = childrenDeriv cx p [XN.mkText ""]++childrenDeriv cx p [tt]+    | ist+      &&+      whitespace s+        = choice p p1+    | ist+        = p1+    where+    ist =            XN.isText    tt+    s   = fromJust . XN.getText $ tt+    p1  = childDeriv cx p tt++childrenDeriv cx p children+    = stripChildrenDeriv cx p children++stripChildrenDeriv :: Context -> Pattern -> XmlTrees -> Pattern+stripChildrenDeriv _ p []+    = p++stripChildrenDeriv cx p (h:t)+    = stripChildrenDeriv cx+      ( if strip h+        then p+        else (childDeriv cx p h)+      ) t+++-- ------------------------------------------------------------+--+-- | computes the derivative of a pattern with respect to a end tag++endTagDeriv :: Pattern -> Pattern+endTagDeriv (Choice p1 p2)+    = choice (endTagDeriv p1) (endTagDeriv p2)++endTagDeriv (After p1 p2)+    | nullable p1+        = p2+    | otherwise+        = notAllowed $+          show p1 ++ " expected"++endTagDeriv n@(NotAllowed _)+    = n++endTagDeriv _+    = notAllowed "Call to endTagDeriv with wrong arguments"++-- ------------------------------------------------------------+--+-- | applies a function (first parameter) to the second part of a after pattern++applyAfter :: (Pattern -> Pattern) -> Pattern -> Pattern++applyAfter f (After p1 p2)      = after p1 (f p2)+applyAfter f (Choice p1 p2)     = choice (applyAfter f p1) (applyAfter f p2)+applyAfter _ n@(NotAllowed _)   = n+applyAfter _ _                  = notAllowed "Call to applyAfter with wrong arguments"++-- --------------------++-- mothers little helpers++strip           :: XmlTree -> Bool+strip           = maybe False whitespace . XN.getText++whitespace      :: String -> Bool+whitespace      = all isXmlSpaceChar++showXts         :: XmlTrees -> String+showXts         = concat . runLA (xshow $ arrL id)++-- ------------------------------------------------------------
+ src/Text/XML/HXT/RelaxNG/Validator.hs view
@@ -0,0 +1,293 @@+-- |+-- This module exports the core functions from the basic validation und simplification libraries.+-- It also exports some helper functions for easier access to the validation functionality.++module Text.XML.HXT.RelaxNG.Validator+  ( validateDocumentWithRelaxSchema+  , validateDocumentWithRelax++  , validate+  , validateSchema+  , validateWithSpezification+  , validateSchemaWithSpezification+  , validateWithoutSpezification+  , module Text.XML.HXT.RelaxNG.Validation+  , module Text.XML.HXT.RelaxNG.Simplification+  )+where++import Control.Arrow.ListArrows++import Text.XML.HXT.DOM.Interface++import Text.XML.HXT.Arrow.XmlArrow+import Text.XML.HXT.Arrow.XmlState+import Text.XML.HXT.Arrow.XmlState.TypeDefs++import Text.XML.HXT.RelaxNG.Validation+import Text.XML.HXT.RelaxNG.Simplification+import Text.XML.HXT.RelaxNG.Schema        as S++-- ------------------------------------------------------------++{- |+   validate a document with a Relax NG schema++   * 1.parameter  : the system configuration option list for validation++   - 2.parameter  : the URI of the Relax NG Schema++   - arrow-input  : the document to be validated, namespaces must have been processed++   - arrow-output : the input document, or in case of validation errors, an empty document with status information in the root++configuration options evaluated by validateDocumentWithRelaxSchema:++    * 'withRelaxCheckRestr'      : check Relax NG schema restrictions when simplifying the schema (default: on)++    - 'withRelaxValidateExtRef'  : validate a Relax NG schema referenced by a externalRef-Pattern (default: on)++    - 'withRelaxValidateInclude' : validate a Relax NG schema referenced by a include-Pattern (default: on)++example:++> validateDocumentWithRelaxSchema [withRelaxCheckRestr yes, withRelaxValidateExtRef no] "testSchema.rng"+++-}++validateDocumentWithRelaxSchema :: SysConfigList -> String -> IOStateArrow s XmlTree XmlTree+validateDocumentWithRelaxSchema config relaxSchema+    = ( withoutUserState+        $+        localSysEnv+        $+        configSysVars config+        >>>+        ( ( validate' $< validSchema )    -- try to validate, only possible if schema is o.k.+          `orElse`+          this+        )+      )+      `when`+      documentStatusOk                  -- only do something when document status is ok+    where+    validate' schema+        = setDocumentStatusFromSystemState "read and build Relax NG schema"+          >>>+          validateDocumentWithRelax schema++    validSchema+        = traceMsg 2 ( "read Relax NG schema document: " ++ show relaxSchema )+          >>>+          readForRelax relaxSchema+          >>>+          perform ( let checkSchema = True in           -- test option in al+                    if checkSchema+                    then validateWithRelaxAndHandleErrors S.relaxSchemaArrow+                    else none+                  )+          >>>+          traceMsg 2 "create simplified schema"+          >>>+          ( (\ (b1, (b2, b3)) -> createSimpleForm b1 b2 b3)+            $<+            getSysVar (theRelaxCheckRestr     .&&&.+                       theRelaxValidateExtRef .&&&.+                       theRelaxValidateInclude+                      )+          )+          >>>+          traceDoc "simplified schema"+          >>>+          perform ( getErrors+                    >>>+                    handleSimplificationErrors+                  )++handleSimplificationErrors      :: IOSArrow XmlTree XmlTree+handleSimplificationErrors+    = traceDoc "simplification errors"+      >>>+      getChildren >>> getAttrValue "desc"+      >>>+      arr ("Relax NG validation: " ++)+      >>>+      mkError c_err+      >>>+      filterErrorMsg+++{- | validate an XML document with respect to a Relax NG schema++   * 1.parameter  : the valid and simplified schema as XML tree++   - arrow-input  : the document to be validated++   - arrow-output : the validated and unchanged document or the empty document with status information set in the root node+-}++validateDocumentWithRelax       :: XmlTree -> IOSArrow XmlTree XmlTree+validateDocumentWithRelax schema+    = ( traceMsg 1 "validate document with Relax NG schema"+        >>>+        perform ( validateWithRelaxAndHandleErrors (constA schema) )+        >>>+        setDocumentStatusFromSystemState "validate document with Relax NG schema"+      )+      `when` documentStatusOk                           -- only do something when document status is ok+++{- |+   normalize a document for Relax NG validation,+   call the 'Text.XML.HXT.RelaxNG.Validation.validateRelax' function for doing the hard work,+   and issue errors++   * 1.parameter  : the arrow for computing the schema++   - arrow-input  : the document to be validated++   - arrow-output : nothing+-}++-- ------------------------------------------------------------++{- | Document validation++Validates a xml document with respect to a Relax NG schema.++First, the schema is validated with respect to the Relax NG Spezification. If no error is found, the xml document is validated with respect to the schema.++   * 1.parameter :  list of options; namespace progagation is always done++   - 2.parameter :  XML document++   - 3.parameter :  Relax NG schema file++available options:++    * 'a_do_not_check_restrictions' : do not check Relax NG schema restrictions (includes do-not-validate-externalRef, do-not-validate-include)++    - 'a_do_not_validate_externalRef' : do not validate a Relax NG schema referenced by a externalRef-Pattern++    - 'a_validate_externalRef' : validate a Relax NG schema referenced by a externalRef-Pattern (default)++    - 'a_do_not_validate_include' : do not validate a Relax NG schema referenced by a include-Pattern++    - 'a_validate_include' : validate a Relax NG schema referenced by a include-Pattern (default)++    - 'a_output_changes' : output Pattern transformations in case of an error++    - 'a_do_not_collect_errors' : stop Relax NG simplification after the first error has occurred++    - all 'Text.XML.HXT.Arrow.ReadDocument.readDocument' options++example:++> validate [(a_do_not_check_restrictions, "1")] "test.xml" "testSchema.rng"++-}+validate :: String -> String -> IOSArrow n XmlTree+validate xmlDocument relaxSchema+  = S.relaxSchemaArrow+    >>>+    validateWithSpezification xmlDocument relaxSchema+++++{- | Relax NG schema validation++Validates a Relax NG schema with respect to the Relax NG Spezification.++   * 1.parameter :  Relax NG schema file++-}+validateSchema :: String -> IOSArrow n XmlTree+validateSchema relaxSchema+  = validate "" relaxSchema++++{- | Document validation++Validates a xml document with respect to a Relax NG schema. Similar to 'validate', but the Relax NG Specification is not created. Can be used, to check a list of documents more efficiently.++   * 1.parameter :  XML document++   - 2.parameter :  Relax NG schema file++   - arrow-input  :  Relax NG Specification in simple form++example:++> Text.XML.HXT.RelaxNG.Schema.relaxSchemaArrow+> >>>+> ( validateWithSpezification "foo.xml" "foo.rng"+>   &&&+>   validateWithSpezification "bar.xml" "bar.rng"+> )+++-}+validateWithSpezification :: String -> String -> IOSArrow XmlTree XmlTree+validateWithSpezification xmlDocument relaxSchema+  = -- validation of the schema with respect to the specification+    -- returns a list of errors or none if the schema is correct++    ( validateRelax $< ( readForRelax relaxSchema+                         >>>+                         getChildren+                       )+    )+    `orElse`++    -- validation of the xml document with respect to the schema+    -- returns a list of errors or none if the xml document is correct++    validateWithoutSpezification xmlDocument relaxSchema++{- | Relax NG schema validation++    see 'validateSchema' and 'validateWithSpezification'++   * 1.parameter :  Relax NG schema file++   - arrow-input  :  Relax NG Specification in simple form+-}++validateSchemaWithSpezification :: String -> IOSArrow XmlTree XmlTree+validateSchemaWithSpezification relaxSchema+  = validateWithSpezification "" relaxSchema++++{- | Document validation++Validates a xml document with respect to a Relax NG schema, but the schema is @not@ validated with respect to a specification first. Should be used only for valid Relax NG schemes.++   * 1.parameter :  XML document++   - 2.parameter :  Relax NG schema file++-}+++validateWithoutSpezification :: String -> String -> IOSArrow n XmlTree+validateWithoutSpezification xmlDocument relaxSchema+  = readForRelax relaxSchema+    >>>+    createSimpleForm True True True+    >>>+    ( ( getErrors >>> perform handleSimplificationErrors )              -- issue errors in schema simplification+      `orElse`+      ( if null xmlDocument                                             -- no errors: validate document+        then none+        else validateRelax $< ( readForRelax xmlDocument+                                >>>+                                normalizeForRelaxValidation+                                >>>+                                getChildren+                              )+      )+    )
+ src/Text/XML/HXT/RelaxNG/XMLSchema/DataTypeLibW3C.hs view
@@ -0,0 +1,480 @@+-- ------------------------------------------------------------++{- |+   Module     : Text.XML.HXT.XMLSchema.DataTypeLibW3C+   Copyright  : Copyright (C) 2005-2010 Uwe Schmidt+   License    : MIT++   Maintainer : Uwe Schmidt (uwe@fh-wedel.de)+   Stability  : experimental+   Portability: portable+   Version    : $Id$++   Datatype library for the W3C XML schema datatypes++-}++-- ------------------------------------------------------------++module Text.XML.HXT.RelaxNG.XMLSchema.DataTypeLibW3C+  ( module Text.XML.HXT.XMLSchema.DataTypeLibW3CNames+  , w3cDatatypeLib+  )+where++import Data.Maybe+import Data.Ratio++import Network.URI                              ( isURIReference )++import Text.Regex.XMLSchema.String              ( Regex+                                                , matchRE+                                                , parseRegex+                                                , isZero+                                                )++import Text.XML.HXT.DOM.QualifiedName           ( isWellformedQualifiedName+                                                , isNCName+                                                )+import Text.XML.HXT.XMLSchema.DataTypeLibW3CNames++import Text.XML.HXT.RelaxNG.DataTypeLibUtils++-- ------------------------------------------------------------++-- | The main entry point to the W3C XML schema datatype library.+--+-- The 'DTC' constructor exports the list of supported datatypes and params.+-- It also exports the specialized functions to validate a XML instance value with+-- respect to a datatype.+w3cDatatypeLib :: DatatypeLibrary+w3cDatatypeLib = (w3cNS, DTC datatypeAllowsW3C datatypeEqualW3C w3cDatatypes)+++-- | All supported datatypes of the library+w3cDatatypes :: AllowedDatatypes+w3cDatatypes = [ (xsd_string,                   stringParams)+               , (xsd_normalizedString,         stringParams)+               , (xsd_token,                    stringParams)+               , (xsd_language,                 stringParams)+               , (xsd_NMTOKEN,                  stringParams)+               , (xsd_NMTOKENS,                 listParams  )+               , (xsd_Name,                     stringParams)+               , (xsd_NCName,                   stringParams)+               , (xsd_ID,                       stringParams)+               , (xsd_IDREF,                    stringParams)+               , (xsd_IDREFS,                   listParams  )+               , (xsd_ENTITY,                   stringParams)+               , (xsd_ENTITIES,                 listParams  )+               , (xsd_anyURI,                   stringParams)+               , (xsd_QName,                    stringParams)+               , (xsd_NOTATION,                 stringParams)+               , (xsd_hexBinary,                stringParams)+               , (xsd_base64Binary,             stringParams)+               , (xsd_decimal,                  decimalParams)+               , (xsd_integer,                  integerParams)+               , (xsd_nonPositiveInteger,       integerParams)+               , (xsd_negativeInteger,          integerParams)+               , (xsd_nonNegativeInteger,       integerParams)+               , (xsd_positiveInteger,          integerParams)+               , (xsd_long,                     integerParams)+               , (xsd_int,                      integerParams)+               , (xsd_short,                    integerParams)+               , (xsd_byte,                     integerParams)+               , (xsd_unsignedLong,             integerParams)+               , (xsd_unsignedInt,              integerParams)+               , (xsd_unsignedShort,            integerParams)+               , (xsd_unsignedByte,             integerParams)+               ]++-- ----------------------------------------++-- | List of allowed params for the string datatypes+stringParams    :: AllowedParams+stringParams    = xsd_pattern : map fst fctTableString++-- ----------------------------------------++patternValid    :: ParamList -> CheckString+patternValid params+    = foldr (>>>) ok . map paramPatternValid $ params+      where+      paramPatternValid (pn, pv)+          | pn == xsd_pattern   = assert (patParamValid pv) (errorMsgParam pn pv)+          | otherwise           = ok++patParamValid :: String -> String -> Bool+patParamValid regex a+    | isZero ex = False+    | otherwise = matchRE ex a+    where+    ex = parseRegex regex++-- ----------------------------------------++-- | List of allowed params for the decimal datatypes++decimalParams   :: AllowedParams+decimalParams   = xsd_pattern : map fst fctTableDecimal++fctTableDecimal :: [(String, String -> Rational -> Bool)]+fctTableDecimal+    = [ (xsd_maxExclusive,   cvd (>))+      , (xsd_minExclusive,   cvd (<))+      , (xsd_maxInclusive,   cvd (>=))+      , (xsd_minInclusive,   cvd (<=))+      , (xsd_totalDigits,    cvi (\ l v ->    totalDigits v == l))+      , (xsd_fractionDigits, cvi (\ l v -> fractionDigits v == l))+      ]+    where+    cvd         :: (Rational -> Rational -> Bool) -> (String -> Rational -> Bool)+    cvd op      = \ x y -> isDecimal x && readDecimal x `op` y++    cvi         :: (Int -> Rational -> Bool) -> (String -> Rational -> Bool)+    cvi op      = \ x y -> isNumber x && read x `op` y++decimalValid    :: ParamList -> CheckA Rational Rational+decimalValid params+    = foldr (>>>) ok . map paramDecimalValid $ params+    where+    paramDecimalValid (pn, pv)+        = assert+          ((fromMaybe (const . const $ True) . lookup pn $ fctTableDecimal) pv)+          (errorMsgParam pn pv . showDecimal)++-- ----------------------------------------++-- | List of allowed params for the decimal and integer datatypes++integerParams   :: AllowedParams+integerParams   = xsd_pattern : map fst fctTableInteger++fctTableInteger :: [(String, String -> Integer -> Bool)]+fctTableInteger+    = [ (xsd_maxExclusive,   cvi (>))+      , (xsd_minExclusive,   cvi (<))+      , (xsd_maxInclusive,   cvi (>=))+      , (xsd_minInclusive,   cvi (<=))+      , (xsd_totalDigits,    cvi (\ l v -> totalD v == toInteger l))+      ]+    where+    cvi         :: (Integer -> Integer -> Bool) -> (String -> Integer -> Bool)+    cvi op      = \ x y -> isNumber x && read x `op` y++    totalD i+        | i < 0     = totalD (0-i)+        | otherwise = toInteger . length . show $ i++integerValid    :: DatatypeName -> ParamList -> CheckA Integer Integer+integerValid datatype params+    = assertInRange+      >>>+      (foldr (>>>) ok . map paramIntegerValid $ params)+    where+    assertInRange       :: CheckA Integer Integer+    assertInRange+        = assert+          (fromMaybe (const True) . lookup datatype $ integerRangeTable)+          (\ v -> ( "Datatype " ++ show datatype +++                    " with value = " ++ show v +++                    " not in integer value range"+                  )+          )+    paramIntegerValid (pn, pv)+        = assert+          ((fromMaybe (const . const $ True) . lookup pn $ fctTableInteger) pv)+          (errorMsgParam pn pv . show)++integerRangeTable       :: [(String, Integer -> Bool)]+integerRangeTable       = [ (xsd_integer,               const True)+                          , (xsd_nonPositiveInteger,    (<=0)   )+                          , (xsd_negativeInteger,       ( <0)   )+                          , (xsd_nonNegativeInteger,    (>=0)   )+                          , (xsd_positiveInteger,       ( >0)   )+                          , (xsd_long,                  inR 9223372036854775808)+                          , (xsd_int,                   inR 2147483648)+                          , (xsd_short,                 inR 32768)+                          , (xsd_byte,                  inR 128)+                          , (xsd_unsignedLong,          inP 18446744073709551616)+                          , (xsd_unsignedInt,           inP 4294967296)+                          , (xsd_unsignedShort,         inP 65536)+                          , (xsd_unsignedByte,          inP 256)+                          ]+                          where+                          inR b i       = (0 - b) <= i && i < b+                          inP b i       = 0 <= i       && i < b++-- ----------------------------------------++-- | List of allowed params for the list datatypes++listParams      :: AllowedParams+listParams      = xsd_pattern : map fst fctTableList++listValid       :: DatatypeName -> ParamList -> CheckString+listValid d     = stringValidFT fctTableList d 0 (-1)++-- ----------------------------------------++isNameList      :: (String -> Bool) -> String -> Bool+isNameList p w+    = not (null ts) && all p ts+      where+      ts = words w++-- ----------------------------------------++rex             :: String -> Regex+rex regex+    | isZero ex = error $ "syntax error in regexp " ++ show regex+    | otherwise = ex+    where+    ex = parseRegex regex++-- ----------------------------------------++rexLanguage+  , rexHexBinary+  , rexBase64Binary+  , rexDecimal+  , rexInteger  :: Regex++rexLanguage     = rex "[A-Za-z]{1,8}(-[A-Za-z]{1,8})*"+rexHexBinary    = rex "([A-Fa-f0-9]{2})*"+rexBase64Binary = rex $+                  "(" ++ b64 ++ "{4})*((" ++ b64 ++ "{2}==)|(" ++ b64 ++ "{3}=)|)"+                  where+                  b64     = "[A-Za-z0-9+/]"+rexDecimal      = rex "(\\+|-)?(([0-9]+(\\.[0-9]*)?)|(\\.[0-9]+))"+rexInteger      = rex "(\\+|-)?[0-9]+"++isLanguage+  , isHexBinary+  , isBase64Binary+  , isDecimal+  , isInteger   :: String -> Bool++isLanguage      = matchRE rexLanguage+isHexBinary     = matchRE rexHexBinary+isBase64Binary  = matchRE rexBase64Binary+isDecimal       = matchRE rexDecimal+isInteger       = matchRE rexInteger++-- ----------------------------------------++normBase64      :: String -> String+normBase64      = filter isB64+                  where+                  isB64 c = ( 'A' <= c && c <= 'Z')+                            ||+                            ( 'a' <= c && c <= 'z')+                            ||+                            ( '0' <= c && c <= '9')+                            ||+                            c == '+'+                            ||+                            c == '/'+                            ||+                            c == '='++-- ----------------------------------------++readDecimal+  , readDecimal'        :: String -> Rational++readDecimal ('+':s)     = readDecimal' s+readDecimal ('-':s)     = negate (readDecimal' s)+readDecimal      s      = readDecimal' s++readDecimal' s+    | f == 0    = (n % 1)+    | otherwise = (n % 1) + (f % (10 ^ (toInteger (length fs))))+    where+    (ns, fs') = span (/= '.') s+    fs = drop 1 fs'++    f :: Integer+    f | null fs         = 0+      | otherwise       = read fs+    n :: Integer+    n | null ns         = 0+      | otherwise       = read ns++totalDigits+  , totalDigits'+  , fractionDigits      :: Rational -> Int++totalDigits r+    | r == 0                    = 0+    | r < 0                     = totalDigits' . negate  $ r+    | otherwise                 = totalDigits'           $ r++totalDigits' r+    | denominator r == 1        = length . show . numerator  $ r+    | r < (1%1)                 = (\ x -> x-1) . totalDigits' . (+ (1%1))    $ r+    | otherwise                 = totalDigits' . (* (10 % 1)) $ r++fractionDigits r+    | denominator r == 1        = 0+    | otherwise                 = (+1) . fractionDigits . (* (10 % 1)) $ r++showDecimal+  , showDecimal'                :: Rational -> String++showDecimal d+    | d < 0     = ('-':) . showDecimal' . negate    $ d+    | d < 1     = drop 1 . showDecimal' . (+ (1%1)) $ d+    | otherwise =          showDecimal'             $ d++showDecimal' d+    | denominator d == 1        = show . numerator $ d+    | otherwise                 = times10 0        $ d+    where+    times10 i' d'+        | denominator d' == 1   = let+                                  (x, y) = splitAt i' . reverse . show . numerator $ d'+                                  in+                                  reverse y ++ "." ++ reverse x+        | otherwise             = times10 (i' + 1) (d' * (10 % 1))++-- ----------------------------------------++-- | Tests whether a XML instance value matches a data-pattern.+-- (see also: 'stringValid')++datatypeAllowsW3C :: DatatypeAllows+datatypeAllowsW3C d params value _+    = performCheck check value+    where+    validString normFct+        = validPattern+          >>>+          arr normFct+          >>>+          validLength++    validNormString+        = validString normalizeWhitespace++    validPattern+        = patternValid params++    validLength+        = stringValid d 0 (-1) params++    validList+        = validPattern+          >>>+          arr normalizeWhitespace+          >>>+          validListLength++    validListLength+        = listValid d params++    validName isN+        = assertW3C isN++    validNCName+        = validNormString >>> validName isNCName++    validQName+        = validNormString >>> validName isWellformedQualifiedName++    validDecimal+        = arr normalizeWhitespace+          >>>+          assertW3C isDecimal+          >>>+          checkWith readDecimal (decimalValid params)++    validInteger inRange+        = validPattern+          >>>+          arr normalizeWhitespace+          >>>+          assertW3C isInteger+          >>>+          checkWith read (integerValid inRange params)++    check       :: CheckString+    check       = fromMaybe notFound . lookup d $ checks++    notFound    = failure $ errorMsgDataTypeNotAllowed w3cNS d params++    checks      :: [(String, CheckA String String)]+    checks      = [ (xsd_string,                validString id)+                  , (xsd_normalizedString,      validString normalizeBlanks)+                  , (xsd_token,                 validNormString)+                  , (xsd_language,              validNormString >>> assertW3C isLanguage)+                  , (xsd_NMTOKEN,               validNormString >>> validName isNmtoken)+                  , (xsd_NMTOKENS,              validList       >>> validName (isNameList isNmtoken))+                  , (xsd_Name,                  validNormString >>> validName isName)+                  , (xsd_NCName,                validNCName)+                  , (xsd_ID,                    validNCName)+                  , (xsd_IDREF,                 validNCName)+                  , (xsd_IDREFS,                validList       >>> validName (isNameList isNCName))+                  , (xsd_ENTITY,                validNCName)+                  , (xsd_ENTITIES,              validList       >>> validName (isNameList isNCName))+                  , (xsd_anyURI,                validName isURIReference >>> validString escapeURI)+                  , (xsd_QName,                 validQName)+                  , (xsd_NOTATION,              validQName)+                  , (xsd_hexBinary,             validString id         >>> assertW3C isHexBinary)+                  , (xsd_base64Binary,          validString normBase64 >>> assertW3C isBase64Binary)+                  , (xsd_decimal,               validPattern >>> validDecimal)+                  , (xsd_integer,               validInteger xsd_integer)+                  , (xsd_nonPositiveInteger,    validInteger xsd_nonPositiveInteger)+                  , (xsd_negativeInteger,       validInteger xsd_negativeInteger)+                  , (xsd_nonNegativeInteger,    validInteger xsd_nonNegativeInteger)+                  , (xsd_positiveInteger,       validInteger xsd_positiveInteger)+                  , (xsd_long,                  validInteger xsd_long)+                  , (xsd_int,                   validInteger xsd_int)+                  , (xsd_short,                 validInteger xsd_short)+                  , (xsd_byte,                  validInteger xsd_byte)+                  , (xsd_unsignedLong,          validInteger xsd_unsignedLong)+                  , (xsd_unsignedInt,           validInteger xsd_unsignedInt)+                  , (xsd_unsignedShort,         validInteger xsd_unsignedShort)+                  , (xsd_unsignedByte,          validInteger xsd_unsignedByte)+                  ]+    assertW3C p = assert p errW3C+    errW3C      = errorMsgDataLibQName w3cNS d++-- ----------------------------------------++-- | Tests whether a XML instance value matches a value-pattern.++datatypeEqualW3C :: DatatypeEqual+datatypeEqualW3C d s1 _ s2 _+    = performCheck check (s1, s2)+    where+    check       :: CheckA (String, String) (String, String)+    check       = maybe notFound found . lookup d $ norm++    notFound    = failure $ const (errorMsgDataTypeNotAllowed0 w3cNS d)++    found nf    = arr (\ (x1, x2) -> (nf x1, nf x2))                    -- normalize both values+                  >>>+                  assert (uncurry (==)) (uncurry $ errorMsgEqual d)     -- and check on (==)++    norm = [ (xsd_string,               id                      )+           , (xsd_normalizedString,     normalizeBlanks         )+           , (xsd_token,                normalizeWhitespace     )+           , (xsd_language,             normalizeWhitespace     )+           , (xsd_NMTOKEN,              normalizeWhitespace     )+           , (xsd_NMTOKENS,             normalizeWhitespace     )+           , (xsd_Name,                 normalizeWhitespace     )+           , (xsd_NCName,               normalizeWhitespace     )+           , (xsd_ID,                   normalizeWhitespace     )+           , (xsd_IDREF,                normalizeWhitespace     )+           , (xsd_IDREFS,               normalizeWhitespace     )+           , (xsd_ENTITY,               normalizeWhitespace     )+           , (xsd_ENTITIES,             normalizeWhitespace     )+           , (xsd_anyURI,               escapeURI . normalizeWhitespace )+           , (xsd_QName,                normalizeWhitespace     )+           , (xsd_NOTATION,             normalizeWhitespace     )+           , (xsd_hexBinary,            id                      )+           , (xsd_base64Binary,         normBase64              )+           , (xsd_decimal,              show . readDecimal . normalizeWhitespace        )+           ]++-- ----------------------------------------