hxt-relaxng-9.1.4/0000755000000000000000000000000011701313713012151 5ustar0000000000000000hxt-relaxng-9.1.4/Setup.hs0000644000000000000000000000011011701313713013575 0ustar0000000000000000#!/usr/bin/env runhaskell import Distribution.Simple main = defaultMain hxt-relaxng-9.1.4/LICENSE0000644000000000000000000000212011701313712013150 0ustar0000000000000000The 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. hxt-relaxng-9.1.4/hxt-relaxng.cabal0000644000000000000000000000456411701313713015407 0ustar0000000000000000-- arch-tag: Haskell XML Toolbox main description file Name: hxt-relaxng Version: 9.1.4 Synopsis: The HXT RelaxNG validator Description: The HXT RelaxNG validator License: MIT License-file: LICENSE Author: Uwe Schmidt, Martin Schmidt, Torben Kuseler Maintainer: Uwe Schmidt Stability: Stable Category: XML Homepage: http://www.fh-wedel.de/~si/HXmlToolbox/index.html Copyright: Copyright (c) 2005-2011 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/Validate.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 examples/hrelaxng/simple.xml examples/hrelaxng/simple-qualified.rng examples/hrelaxng/simple-unqualified.rng 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 ghc-prof-options: -auto-all -caf-all -- extensions: MultiParamTypeClasses DeriveDataTypeable FunctionalDependencies FlexibleInstances build-depends: base >= 4 && < 5, containers >= 0.2 && < 1, parsec >= 2.1 && < 4, network >= 2.1 && < 3, hxt >= 9.1.3 && < 10, hxt-charproperties >= 9 && < 10, hxt-regex-xmlschema >= 9 && < 10hxt-relaxng-9.1.4/src/0000755000000000000000000000000011701313712012737 5ustar0000000000000000hxt-relaxng-9.1.4/src/Text/0000755000000000000000000000000011701313712013663 5ustar0000000000000000hxt-relaxng-9.1.4/src/Text/XML/0000755000000000000000000000000011701313712014323 5ustar0000000000000000hxt-relaxng-9.1.4/src/Text/XML/HXT/0000755000000000000000000000000011701313712014766 5ustar0000000000000000hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG.hs0000644000000000000000000000213311701313712016621 0ustar0000000000000000-- ------------------------------------------------------------ {- | 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 -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/0000755000000000000000000000000011701313712016266 5ustar0000000000000000hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/SystemConfig.hs0000644000000000000000000001026411701313712021237 0ustar0000000000000000-- ------------------------------------------------------------ {- | 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" -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/DataTypeLibMysql.hs0000644000000000000000000001260311701313712022014 0ustar0000000000000000-- | -- 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) -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/Validator.hs0000644000000000000000000001431011701313712020546 0ustar0000000000000000-- | -- 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 , validateSchemaWithRelax , validateWithSpezification , validateSchemaWithSpezification , 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.BasicArrows 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 >>> traceMsg 1 ( "start validating document with Relax NG schema: " ++ show relaxSchema ) >>> ( ( ( validate' $< validateSchemaWithRelax relaxSchema) -- try to validate, only possible if schema is o.k. >>> traceMsg 1 ( "validating document with Relax NG schema done" ) ) `orElse` ( setDocumentStatusFromSystemState "validating Relax NG schema" >>> traceMsg 1 ( "no validation done, Relax NG schema is not correct" ) ) ) ) `when` documentStatusOk -- only do something when document status is ok where validate' schema = setDocumentStatusFromSystemState "read and build Relax NG schema" >>> validateDocumentWithRelax schema validateSchemaWithRelax :: String -> IOSArrow XmlTree XmlTree validateSchemaWithRelax relaxSchema = traceMsg 2 ( "read and check Relax NG schema document: " ++ show relaxSchema ) >>> readForRelax relaxSchema >>> ( let checkSchema = True in -- test option in al if checkSchema then validateWithRelax S.relaxSchemaArrow `guards` this else this ) >>> traceMsg 2 "create simplified schema" >>> ( (\ (b1, (b2, b3)) -> createSimpleForm b1 b2 b3) $< getSysVar (theRelaxCheckRestr .&&&. theRelaxValidateExtRef .&&&. theRelaxValidateInclude ) ) >>> traceDoc "simplified schema" >>> traceMsg 2 "collect and issue schema errors" >>> perform handleSimplificationErrors >>> resetStates >>> setDocumentStatusFromSystemState "validating Relax NG schema" >>> documentStatusOk >>> traceMsg 2 "Relax NG schema is o.k." handleSimplificationErrors :: IOSArrow XmlTree XmlTree handleSimplificationErrors = traceDoc "simplification errors" >>> getErrors >>> getRngAttrDescr >>> 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 ( validateWithRelax (constA schema) ) >>> setDocumentStatusFromSystemState "validate document with Relax NG schema" ) `when` documentStatusOk -- only do something when document status is ok -- ------------------------------------------------------------ {- | Relax NG schema validation see 'validateSchemaWithRelax' 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 * 1.parameter : XML document - 2.parameter : Relax NG schema file -} validateWithSpezification :: String -> String -> IOSArrow XmlTree XmlTree validateWithSpezification xmlDocument relaxSchema = validDoc $< listA (validateSchemaWithRelax relaxSchema) where validDoc [theSchema] | null xmlDocument = none | otherwise = ifA ( readForRelax xmlDocument >>> normalizeForRelaxValidation >>> validateRelax theSchema ) none ( err "Document is not valid with respect to Relax NG Schema" ) validDoc _ = err "Relax NG Schema not correct" -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/CreatePattern.hs0000644000000000000000000002506511701313712021373 0ustar0000000000000000-- | -- -- 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 ) {- import qualified Debug.Trace as T -} -- ------------------------------------------------------------ -- | 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 "internal HXT RelaxNG error" ] 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" ++ " (" ++ errStr ++ ")" ) ) , 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) hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/SchemaGrammar.hs0000644000000000000000000043671611701313712021352 0ustar0000000000000000{-# OPTIONS_GHC -fno-warn-unused-binds #-} {- | 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 = mkName "RelaxContext-xml" mkelem_qn1 = mkElement qn1 mkattr_qn1 = mkAttr qn1 qn2 = mkName "RelaxContextBaseURI" mkelem_qn2 = mkElement qn2 mkattr_qn2 = mkAttr qn2 qn3 = mkName "RelaxContextDefault" mkelem_qn3 = mkElement qn3 mkattr_qn3 = mkAttr qn3 qn4 = mkNsName "anyName" ns1 mkelem_qn4 = mkElement qn4 mkattr_qn4 = mkAttr qn4 qn5 = mkNsName "attribute" ns1 mkelem_qn5 = mkElement qn5 mkattr_qn5 = mkAttr qn5 qn6 = mkNsName "choice" ns1 mkelem_qn6 = mkElement qn6 mkattr_qn6 = mkAttr qn6 qn7 = mkNsName "data" ns1 mkelem_qn7 = mkElement qn7 mkattr_qn7 = mkAttr qn7 qn8 = mkName "datatypeLibrary" mkelem_qn8 = mkElement qn8 mkattr_qn8 = mkAttr qn8 qn9 = mkNsName "define" ns1 mkelem_qn9 = mkElement qn9 mkattr_qn9 = mkAttr qn9 qn10 = mkNsName "element" ns1 mkelem_qn10 = mkElement qn10 mkattr_qn10 = mkAttr qn10 qn11 = mkNsName "empty" ns1 mkelem_qn11 = mkElement qn11 mkattr_qn11 = mkAttr qn11 qn12 = mkNsName "except" ns1 mkelem_qn12 = mkElement qn12 mkattr_qn12 = mkAttr qn12 qn13 = mkNsName "grammar" ns1 mkelem_qn13 = mkElement qn13 mkattr_qn13 = mkAttr qn13 qn14 = mkNsName "group" ns1 mkelem_qn14 = mkElement qn14 mkattr_qn14 = mkAttr qn14 qn15 = mkNsName "interleave" ns1 mkelem_qn15 = mkElement qn15 mkattr_qn15 = mkAttr qn15 qn16 = mkName "name" mkelem_qn16 = mkElement qn16 mkattr_qn16 = mkAttr qn16 qn17 = mkNsName "name" ns1 mkelem_qn17 = mkElement qn17 mkattr_qn17 = mkAttr qn17 qn18 = mkName "ns" mkelem_qn18 = mkElement qn18 mkattr_qn18 = mkAttr qn18 qn19 = mkNsName "nsName" ns1 mkelem_qn19 = mkElement qn19 mkattr_qn19 = mkAttr qn19 qn20 = mkNsName "oneOrMore" ns1 mkelem_qn20 = mkElement qn20 mkattr_qn20 = mkAttr qn20 qn21 = mkNsName "ref" ns1 mkelem_qn21 = mkElement qn21 mkattr_qn21 = mkAttr qn21 qn22 = mkNsName "start" ns1 mkelem_qn22 = mkElement qn22 mkattr_qn22 = mkAttr qn22 qn23 = mkNsName "text" ns1 mkelem_qn23 = mkElement qn23 mkattr_qn23 = mkAttr qn23 qn24 = mkName "type" mkelem_qn24 = mkElement qn24 mkattr_qn24 = mkAttr qn24 qn25 = mkNsName "value" ns1 mkelem_qn25 = mkElement qn25 mkattr_qn25 = mkAttr qn25 in mkRoot [] [ mkelem_qn13 [] [ mkelem_qn22 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "44" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "externalRef" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "href" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "43" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "notAllowed" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "40" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "data" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "type" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "41" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "42" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "except" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "41" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "param" ] , mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn23 [] [] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "39" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "value" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "type" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn23 [] [] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "38" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "text" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "37" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "empty" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "36" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "parentRef" ] , mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "35" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "ref" ] , mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "34" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "mixed" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "33" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "list" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "32" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "oneOrMore" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "31" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "zeroOrMore" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "30" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "optional" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "29" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "choice" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "28" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "interleave" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "27" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "group" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "26" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "attribute" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "QName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "18" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "19" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "20" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "21" ] ] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "25" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "element" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "QName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "18" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "19" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "20" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "21" ] ] [] ] ] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "24" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "include" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "href" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "11" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "10" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "22" ] ] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "23" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "div" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "11" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "10" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "23" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "22" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "div" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "11" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "10" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "22" ] ] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "21" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "choice" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "18" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "19" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "20" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "21" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "20" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "nsName" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "17" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "19" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "anyName" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "17" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "18" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "name" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn7 [ mkattr_qn24 [ mkText "QName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "17" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "except" ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "18" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "19" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "20" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "21" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "16" ] ] [ mkelem_qn10 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [] , mkelem_qn23 [] [] ] , mkelem_qn23 [] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "0" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "0" ] ] [ mkelem_qn10 [] [ mkelem_qn4 [] [] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [] , mkelem_qn23 [] [] ] , mkelem_qn23 [] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "0" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "10" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "define" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "combine" ] , mkelem_qn6 [] [ mkelem_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/theo/haskell/hxt/hxt-relaxng/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" ] , mkelem_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/theo/haskell/hxt/hxt-relaxng/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" ] ] ] ] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "11" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "start" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "combine" ] , mkelem_qn6 [] [ mkelem_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/theo/haskell/hxt/hxt-relaxng/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" ] , mkelem_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/theo/haskell/hxt/hxt-relaxng/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" ] ] ] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "14" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "14" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "grammar" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "11" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "10" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "23" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] ] ] ] ] ] ] ] ] ] hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/Schema.hs0000644000000000000000000044615011701313712020034 0ustar0000000000000000{-# OPTIONS_GHC -fno-warn-unused-binds #-} {- | 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 = mkName "RelaxContext-xml" mkelem_qn1 = mkElement qn1 mkattr_qn1 = mkAttr qn1 qn2 = mkName "RelaxContextBaseURI" mkelem_qn2 = mkElement qn2 mkattr_qn2 = mkAttr qn2 qn3 = mkName "RelaxContextDefault" mkelem_qn3 = mkElement qn3 mkattr_qn3 = mkAttr qn3 qn4 = mkNsName "anyName" ns1 mkelem_qn4 = mkElement qn4 mkattr_qn4 = mkAttr qn4 qn5 = mkNsName "attribute" ns1 mkelem_qn5 = mkElement qn5 mkattr_qn5 = mkAttr qn5 qn6 = mkNsName "choice" ns1 mkelem_qn6 = mkElement qn6 mkattr_qn6 = mkAttr qn6 qn7 = mkNsName "data" ns1 mkelem_qn7 = mkElement qn7 mkattr_qn7 = mkAttr qn7 qn8 = mkName "datatypeLibrary" mkelem_qn8 = mkElement qn8 mkattr_qn8 = mkAttr qn8 qn9 = mkNsName "define" ns1 mkelem_qn9 = mkElement qn9 mkattr_qn9 = mkAttr qn9 qn10 = mkNsName "element" ns1 mkelem_qn10 = mkElement qn10 mkattr_qn10 = mkAttr qn10 qn11 = mkNsName "empty" ns1 mkelem_qn11 = mkElement qn11 mkattr_qn11 = mkAttr qn11 qn12 = mkNsName "except" ns1 mkelem_qn12 = mkElement qn12 mkattr_qn12 = mkAttr qn12 qn13 = mkNsName "grammar" ns1 mkelem_qn13 = mkElement qn13 mkattr_qn13 = mkAttr qn13 qn14 = mkNsName "group" ns1 mkelem_qn14 = mkElement qn14 mkattr_qn14 = mkAttr qn14 qn15 = mkNsName "interleave" ns1 mkelem_qn15 = mkElement qn15 mkattr_qn15 = mkAttr qn15 qn16 = mkName "name" mkelem_qn16 = mkElement qn16 mkattr_qn16 = mkAttr qn16 qn17 = mkNsName "name" ns1 mkelem_qn17 = mkElement qn17 mkattr_qn17 = mkAttr qn17 qn18 = mkName "ns" mkelem_qn18 = mkElement qn18 mkattr_qn18 = mkAttr qn18 qn19 = mkNsName "nsName" ns1 mkelem_qn19 = mkElement qn19 mkattr_qn19 = mkAttr qn19 qn20 = mkNsName "oneOrMore" ns1 mkelem_qn20 = mkElement qn20 mkattr_qn20 = mkAttr qn20 qn21 = mkNsName "ref" ns1 mkelem_qn21 = mkElement qn21 mkattr_qn21 = mkAttr qn21 qn22 = mkNsName "start" ns1 mkelem_qn22 = mkElement qn22 mkattr_qn22 = mkAttr qn22 qn23 = mkNsName "text" ns1 mkelem_qn23 = mkElement qn23 mkattr_qn23 = mkAttr qn23 qn24 = mkName "type" mkelem_qn24 = mkElement qn24 mkattr_qn24 = mkAttr qn24 qn25 = mkNsName "value" ns1 mkelem_qn25 = mkElement qn25 mkattr_qn25 = mkAttr qn25 in mkRoot [] [ mkelem_qn13 [] [ mkelem_qn22 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "44" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "grammar" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "11" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "10" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "22" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "23" ] ] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "43" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "externalRef" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "href" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "42" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "notAllowed" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "39" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "data" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "type" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "40" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "41" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "41" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "except" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "40" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "param" ] , mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn23 [] [] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "38" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "value" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "type" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn23 [] [] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "37" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "text" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "36" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "empty" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "35" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "parentRef" ] , mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "34" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "ref" ] , mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "33" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "mixed" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "32" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "list" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "31" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "oneOrMore" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "30" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "zeroOrMore" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "29" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "optional" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "28" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "choice" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "27" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "interleave" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "26" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "group" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "25" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "attribute" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn6 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "QName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "17" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "18" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "19" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "20" ] ] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "24" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "element" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "QName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "17" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "18" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "19" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "20" ] ] [] ] ] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "23" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "include" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "href" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "11" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "10" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "21" ] ] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "22" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "div" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "11" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "10" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "22" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "23" ] ] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "21" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "div" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "11" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "10" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "21" ] ] [] ] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "20" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "choice" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "17" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "18" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "19" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "20" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "19" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "nsName" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "18" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "anyName" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "16" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "17" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "name" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] , mkelem_qn7 [ mkattr_qn24 [ mkText "QName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "16" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "except" ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "17" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "18" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "19" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "20" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "15" ] ] [ mkelem_qn10 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [] , mkelem_qn23 [] [] ] , mkelem_qn23 [] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "0" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "0" ] ] [ mkelem_qn10 [] [ mkelem_qn4 [] [] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [] , mkelem_qn23 [] [] ] , mkelem_qn23 [] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "0" ] ] [] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "10" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "define" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "name" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "NCName" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "combine" ] , mkelem_qn6 [] [ mkelem_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/theo/haskell/hxt/hxt-relaxng/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" ] , mkelem_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/theo/haskell/hxt/hxt-relaxng/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" ] ] ] ] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn20 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] , mkelem_qn9 [ mkattr_qn16 [ mkText "11" ] ] [ mkelem_qn10 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [ mkText "start" ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "combine" ] , mkelem_qn6 [] [ mkelem_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/theo/haskell/hxt/hxt-relaxng/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" ] , mkelem_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/theo/haskell/hxt/hxt-relaxng/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" ] ] ] ] , mkelem_qn14 [] [ mkelem_qn14 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "ns" ] , mkelem_qn23 [] [] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn5 [] [ mkelem_qn17 [ mkattr_qn18 [ mkText "" ] ] [ mkText "datatypeLibrary" ] , mkelem_qn7 [ mkattr_qn24 [ mkText "anyURI" ] , mkattr_qn8 [ mkText "http://www.w3.org/2001/XMLSchema-datatypes" ] ] [] ] ] ] , mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn5 [] [ mkelem_qn4 [] [ mkelem_qn12 [] [ mkelem_qn6 [] [ mkelem_qn19 [ mkattr_qn18 [ mkText "http://relaxng.org/ns/structure/1.0" ] ] [] , mkelem_qn19 [ mkattr_qn18 [ mkText "" ] ] [] ] ] ] , mkelem_qn23 [] [] ] ] ] ] ] , mkelem_qn15 [] [ mkelem_qn6 [] [ mkelem_qn11 [] [] , mkelem_qn20 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "15" ] ] [] ] ] , mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn6 [] [ mkelem_qn21 [ mkattr_qn16 [ mkText "24" ] ] [] , mkelem_qn21 [ mkattr_qn16 [ mkText "25" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "26" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "27" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "28" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "29" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "30" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "31" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "32" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "33" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "34" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "35" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "36" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "37" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "38" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "39" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "42" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "43" ] ] [] ] , mkelem_qn21 [ mkattr_qn16 [ mkText "44" ] ] [] ] ] ] ] ] ] ] hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/Validation.hs0000644000000000000000000004217611701313712020726 0ustar0000000000000000-- ------------------------------------------------------------ {- | 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 (). -} -- ------------------------------------------------------------ module Text.XML.HXT.RelaxNG.Validation ( validateWithRelax , validateDocWithRelax , validateRelax , 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 -} -- ------------------------------------------------------------ validateWithRelax :: IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree validateWithRelax theSchema = traceMsg 2 "validate with Relax NG schema" >>> normalizeForRelaxValidation -- prepare the document for validation >>> ( validateRelax $< theSchema ) -- compute and issue validation errors {- | 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 >>> readForRelax doc >>> validateWithRelax theSchema ) {- | Validates an XML document with respect to a Relax NG schema and issues error messages. See also: `validateRelax'` * 1.parameter : Relax NG schema - arrow-input : XML document - arrow-output : the document or in case of errors none -} -- ------------------------------------------------------------ validateRelax :: XmlTree -> IOSArrow XmlTree XmlTree validateRelax rngSchema = fromLA (validateRelax' rngSchema) >>> filterErrorMsg {- | Validates an XML document with respect to a Relax NG schema This arrow is pure. It does not need IO or any configuration parameters. * 1.parameter : Relax NG schema - arrow-input : XML document - arrow-output : the unchanged document or an error message -} validateRelax' :: XmlTree -> LA XmlTree XmlTree validateRelax' rngSchema = ( ( ( constA rngSchema >>> createPatternFromXmlTree ) &&& ( getChildren -- remove the root node >>> isElem -- and select the root element ) ) >>> arr2 (\ pattern xmlDoc -> childDeriv ("", []) pattern xmlDoc) >>> isA (not . nullable) >>> arr ( take 1024 -- pattern may be recursive, so the string representation -- is truncated to 1024 chars to assure termination . ("when validating with Relax NG schema: " ++) . show ) >>> mkError c_err ) `orElse` this -- ------------------------------------------------------------ readForRelax :: String -> IOSArrow b XmlTree readForRelax schema = getDocumentContents schema >>> parseXmlDocument False True False True >>> 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) -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/PatternFunctions.hs0000644000000000000000000000611411701313712022132 0ustar0000000000000000-- | 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" hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/DataTypeLibUtils.hs0000644000000000000000000003035511701313712022013 0ustar0000000000000000-- | -- 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: > 5 invalid example: > foo -} 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: > 5 invalid example: > foo -} 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 -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/DataTypeLibraries.hs0000644000000000000000000001010211701313712022164 0ustar0000000000000000-- | 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 ) ] -- -------------------------------------------------------------------------------------- hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/PatternToString.hs0000644000000000000000000002676411701313712021750 0ustar0000000000000000{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-} module Text.XML.HXT.RelaxNG.PatternToString ( patternToStringTree , patternToFormatedString , xmlTreeToPatternStringTree , xmlTreeToPatternFormatedString , xmlTreeToPatternString , nameClassToString ) where import Control.Arrow.ListArrows import Data.Tree.Class ( formatTree ) 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: > > > ... ... > > -} 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 ++ ")" -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/DataTypes.hs0000644000000000000000000002322411701313712020523 0ustar0000000000000000module 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-" contextAttributesDefault :: String contextAttributesDefault = "RelaxContextDefault" -- | 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) -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/Utils.hs0000644000000000000000000000724211701313712017727 0ustar0000000000000000-- ------------------------------------------------------------ {- | 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.XmlCharParser ( SimpleXParser , withNormNewline ) 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 :: SimpleXParser String -> String -> Bool checkByParsing p s = either (const False) (const True) (runParser p' (withNormNewline ()) "" 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' :: SimpleXParser 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 -- ---------------------------------------- hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/Simplification.hs0000644000000000000000000023746111701313712021611 0ustar0000000000000000-- ------------------------------------------------------------ {- | 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 , resetStates ) where import Control.Arrow.ListArrows import Text.XML.HXT.DOM.Interface import Text.XML.HXT.Arrow.XmlArrow import Text.XML.HXT.Arrow.Edit ( removeWhiteSpace ) import Text.XML.HXT.Arrow.Namespace ( processWithNsEnv ) 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 ) import Data.List ( elemIndices , nub , deleteBy , find , (\\) ) infixr 1 !>>> -- ------------------------------------------------------------ {- - 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. - 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. - 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) >>> hasRngAttrName ) ) >>> ( (addAttrl (getBaseURI >>> createAttrL)) `when` isRngValue ) ) where createAttrL :: IOSArrow String XmlTree createAttrL = setBaseUri <+> ( fromLA $ txt "" >>> catA (map createAttr env) ) where {- old stuff createAttr :: (XName, XName) -> LA XmlTree XmlTree createAttr (pre, uri) = mkRngAttr nm (constA $ show uri) where nm | isNullXName pre = contextAttributesDefault | otherwise = contextAttributes ++ show pre -} createAttr :: (XName, XName) -> LA XmlTree XmlTree createAttr (pre, uri) = mkAttr qn (txt (unXN uri)) where qn :: QName qn | isNullXName pre = mkName $ contextAttributesDefault | otherwise = mkName $ contextAttributes ++ unXN pre setBaseUri :: IOSArrow String XmlTree setBaseUri = mkRngAttrContextBase this replaceQNames :: NsEnv -> String -> IOSArrow XmlTree XmlTree replaceQNames env' name | null px -- no prefix, nothing to do = this | null ns -- prefix there, but no namespace = mkRelaxError "" ( "No namespace mapping for the prefix " ++ show px ++ " in the context of element: " ++ show name ++ ", namespace env is " ++ show (map (unXN *** unXN) env') ) | otherwise -- build universal name = addAttr "name" (universalName qn) where qn = setNamespace env' . mkName $ name px = namePrefix qn ns = namespaceUri qn -- 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 [ hasRngAttrDatatypeLibrary :-> ( processdatatypeLib $< getRngAttrDatatypeLibrary ) -- set the new datatypeLibrary value , ( (isRngData `orElse` isRngValue) >>> neg hasRngAttrDatatypeLibrary ) :-> ( addAttr "datatypeLibrary" lib -- add a datatypeLibrary attribute >>> processdatatypeLib lib ) , this :-> processdatatypeLib lib ] `when` isElem -- ------------------------------------------------------------ {- - 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 -- returns the contents of the (validated) schema -- or a relax error importExternalRef :: String -> String -> IOSArrow XmlTree XmlTree importExternalRef ns href | href `elem` extHRefs = mkRelaxError "" ( "loop in externalRef-Pattern, " ++ formatStringListArr (reverse $ href:extHRefs) ) | otherwise = readForRelax href >>> ( mkRelaxError "" (show href ++ ": can't read URI, referenced in externalRef-Pattern") `whenNot` documentStatusOk ) !>>> ( if validateExternalRef -- if validation parameters are set then ( mkRelaxError "" ( "The content of the schema " ++ show href ++ ", referenced in externalRef does not " ++ "match the syntax for pattern" ) `whenNot` validateWithRelax S.relaxSchemaArrow -- the referenced schema is validated with respect to ) else this ) !>>> ( simplificationStep1 -- perform the transformations from previous steps >>> simplificationStep2 validateExternalRef validateInclude (href:extHRefs) includeHRefs >>> getChildren -- remove the root node >>> isElem >>> ( -- Any ns attribute on the externalRef element -- is transferred to the referenced element addRngAttrNs ns `when` (getRngAttrNs >>> isA (\ a -> a == "" && ns /= "")) ) ) >>> traceDoc ("imported external ref: " ++ show href) importInclude :: String -> IOSArrow XmlTree XmlTree importInclude href | href `elem` includeHRefs = mkRelaxError "" ( "loop in include-Pattern, " ++ formatStringListArr (reverse $ href:includeHRefs) ) | otherwise = processInclude' $< newDoc where processInclude' newDoc' | not . null . runLA isRngRelaxError $ newDoc' = constA newDoc' | otherwise = processInclude href newDoc' newDoc = readForRelax href >>> ( mkRelaxError "" (show href ++ ": can't read URI, referenced in include-Pattern") `whenNot` documentStatusOk ) !>>> ( if validateInclude -- if validation parameters are set then ( mkRelaxError "" ( "The content of the schema " ++ show href ++ ", referenced in include does not " ++ "match the syntax for grammar" ) `whenNot` validateWithRelax SG.relaxSchemaArrow -- the referenced schema is validated with respect to ) else this ) !>>> ( simplificationStep1 -- perform the transformations from previous steps >>> simplificationStep2 validateExternalRef validateInclude extHRefs (href:includeHRefs) >>> getChildren -- remove the root node >>> isElem ) 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 (addRngAttrNs "" `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. rmRngAttrNs `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 | '}' `elem` name = ( addRngAttrNs pre >>> processChildren (changeText $ const local) ) | otherwise = this where (pre', local') = span (/= '}') name pre = tail pre' local = tail local' processnsAttribute :: String -> IOSArrow XmlTree XmlTree processnsAttribute name = processChildren $ choiceA [ (isElem >>> hasRngAttrNs) -- set the new ns attribute value :-> (processnsAttribute $< getRngAttrNs) , ( isNameNsNameValue >>> neg hasRngAttrNs ) -- For any name, nsName or value element that does not have :-> ( addRngAttrNs name -- an ns attribute, an ns attribute is added. >>> 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 $< getQName) >>> 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 p. - 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 p. ( replaceChildren ( mkRngGrammar none ( mkRngStart none getChildren ) ) ) `when` neg (getChildren >>> isRngGrammar) ) >>> ( renameDefines $<< ( getPatternNamesInGrammar "define" >>> ( createUniqueNames &&& 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 (hasRngElemName pattern)) >>> getRngAttrName ) 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 ) &&& -- 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 (mkRngAttrName name) ( ( mkRngElement combine none (arrL (const trees) >>> getChildren) ) >>> (wrapPattern2Two $< getQName) ) 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 = ( hasRngElemName 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' $< ( listA getDefineName -- create a new define id >>> createUniqueNames ) ) ) , isRngDefine :-> processElements True , this :-> processElements False ]) where getDefineName :: IOSArrow XmlTree String getDefineName = firstChild >>> fromLA createNameClass >>> arr show processElements' :: RefList -> IOSArrow XmlTree XmlTree processElements' [(oldname, name)] = storeElement name oldname >>> mkRngRef (createAttr name oldname) none processElements' l = error $ "processElements' called with illegal arg: " ++ show l 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 = mkRngAttrName name <+> mkRngAttrDefineOrigName ("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 [ hasRngElemName 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 ) createUniqueNames :: IOSArrow [String] RefList createUniqueNames = createUnique $< incrSysVar theRelaxDefineId where createUnique num = arr (unique num) -- assign numbers to names >>> ( this *** perform (setSysVar theRelaxDefineId) -- store next unused number ) >>> arr fst where unique :: Int -> [String] -> (RefList, Int) unique n0 l = ( zipWith (\ x n -> (x, show n)) l [n0 ..] , n0 + length l ) -- | 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) => QName -> a XmlTree XmlTree wrapPattern2Two name = choiceA [ noOfChildren (> 2) :-> ( replaceChildren ( (mkElement name none (getChildren >>. take 2) ) <+> (getChildren >>. drop 2) ) >>> wrapPattern2Two name ) , noOfChildren (== 1) :-> getChildren , this :-> this ] (!>>>) :: IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree -> IOSArrow XmlTree XmlTree f !>>> g = f >>> ifA (getSysVar theRelaxNoOfErrors >>> isA (> 0)) this g mkRelaxError :: String -> String -> IOSArrow n XmlTree mkRelaxError changesStr errStr = perform (constA 1 >>> chgSysVar theRelaxNoOfErrors (+)) >>> mkRngRelaxError >>> addRngAttrDescr errStr >>> ( if null changesStr then this else addRngAttrChanges changesStr ) collectErrors :: IOSArrow XmlTree XmlTree collectErrors = none `when` ( (getSysVar theRelaxCollectErrors >>> isA not) >>> errorsFound ) -- | errors found? errorsFound :: IOSArrow a a errorsFound = ( getSysVar theRelaxNoOfErrors >>> isA (> 0) ) `guards` this -- | Returns the list of simplification errors or 'none' getErrors :: IOSArrow XmlTree XmlTree getErrors = errorsFound `guards` multi isRngRelaxError setChangesAttr :: String -> IOSArrow XmlTree XmlTree setChangesAttr str = ifA (hasRngAttrRelaxSimplificationChanges) ( processAttrl $ changeAttrValue (++ (", " ++ str)) `when` isRngAttrRelaxSimplificationChanges ) (mkRngAttrRelaxSimplificationChanges 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 -- -- The schema document has to be parsed with namespace propagation 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 = foldr (!>>>) this $ concat [ return $ traceDoc "relax NG: simplificationPart1 starts" , 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 = foldr (!>>>) this $ concat [ simplificationPart1 , simplificationPart2 , finalCleanUp ] simplificationPart1 :: [IOSArrow XmlTree XmlTree] simplificationPart1 = [ 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 ] 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) -- ------------------------------------------------------------------------------------------------------- hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/BasicArrows.hs0000644000000000000000000003312111701313712021041 0ustar0000000000000000-- ------------------------------------------------------------ {- | Module : Text.XML.HXT.RelaxNG.BasicArrows Copyright : Copyright (C) 2011 Uwe Schmidt License : MIT Maintainer : Uwe Schmidt (uwe@fh-wedel.de) Stability : experimental Portability: portable 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 import Text.XML.HXT.RelaxNG.DataTypes ( a_relaxSimplificationChanges , defineOrigName , contextBaseAttr ) -- ------------------------------------------------------------ hasRngAttName :: ArrowXml a => String -> a XmlTree XmlTree hasRngAttName s = isAttr >>> hasLocalPart s >>> hasNamespaceUri "" hasRngElemName :: ArrowXml a => String -> a XmlTree XmlTree hasRngElemName s = isElem >>> hasLocalPart s >>> hasNamespaceUri relaxNamespace checkRngName :: ArrowXml a => [String] -> a XmlTree XmlTree checkRngName l = catA (map hasRngElemName 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 = hasRngElemName "anyName" isRngAttribute :: ArrowXml a => a XmlTree XmlTree isRngAttribute = hasRngElemName "attribute" isRngChoice :: ArrowXml a => a XmlTree XmlTree isRngChoice = hasRngElemName "choice" isRngCombine :: ArrowXml a => a XmlTree XmlTree isRngCombine = hasRngElemName "combine" isRngData :: ArrowXml a => a XmlTree XmlTree isRngData = hasRngElemName "data" isRngDefine :: ArrowXml a => a XmlTree XmlTree isRngDefine = hasRngElemName "define" isRngDiv :: ArrowXml a => a XmlTree XmlTree isRngDiv = hasRngElemName "div" isRngElement :: ArrowXml a => a XmlTree XmlTree isRngElement = hasRngElemName "element" isRngEmpty :: ArrowXml a => a XmlTree XmlTree isRngEmpty = hasRngElemName "empty" isRngExcept :: ArrowXml a => a XmlTree XmlTree isRngExcept = hasRngElemName "except" isRngExternalRef :: ArrowXml a => a XmlTree XmlTree isRngExternalRef = hasRngElemName "externalRef" isRngGrammar :: ArrowXml a => a XmlTree XmlTree isRngGrammar = hasRngElemName "grammar" isRngGroup :: ArrowXml a => a XmlTree XmlTree isRngGroup = hasRngElemName "group" isRngInclude :: ArrowXml a => a XmlTree XmlTree isRngInclude = hasRngElemName "include" isRngInterleave :: ArrowXml a => a XmlTree XmlTree isRngInterleave = hasRngElemName "interleave" isRngList :: ArrowXml a => a XmlTree XmlTree isRngList = hasRngElemName "list" isRngMixed :: ArrowXml a => a XmlTree XmlTree isRngMixed = hasRngElemName "mixed" isRngName :: ArrowXml a => a XmlTree XmlTree isRngName = hasRngElemName "name" isRngNotAllowed :: ArrowXml a => a XmlTree XmlTree isRngNotAllowed = hasRngElemName "notAllowed" isRngNsName :: ArrowXml a => a XmlTree XmlTree isRngNsName = hasRngElemName "nsName" isRngOneOrMore :: ArrowXml a => a XmlTree XmlTree isRngOneOrMore = hasRngElemName "oneOrMore" isRngOptional :: ArrowXml a => a XmlTree XmlTree isRngOptional = hasRngElemName "optional" isRngParam :: ArrowXml a => a XmlTree XmlTree isRngParam = hasRngElemName "param" isRngParentRef :: ArrowXml a => a XmlTree XmlTree isRngParentRef = hasRngElemName "parentRef" isRngRef :: ArrowXml a => a XmlTree XmlTree isRngRef = hasRngElemName "ref" isRngRelaxError :: ArrowXml a => a XmlTree XmlTree isRngRelaxError = hasRngElemName "relaxError" isRngStart :: ArrowXml a => a XmlTree XmlTree isRngStart = hasRngElemName "start" isRngText :: ArrowXml a => a XmlTree XmlTree isRngText = hasRngElemName "text" isRngType :: ArrowXml a => a XmlTree XmlTree isRngType = hasRngElemName "type" isRngValue :: ArrowXml a => a XmlTree XmlTree isRngValue = hasRngElemName "value" isRngZeroOrMore :: ArrowXml a => a XmlTree XmlTree isRngZeroOrMore = hasRngElemName "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 mkRngRelaxError = mkRngElement "relaxError" none none 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 = hasRngAttName "attribute" isRngAttrCombine :: ArrowXml a => a XmlTree XmlTree isRngAttrCombine = hasRngAttName "combine" isRngAttrDatatypeLibrary :: ArrowXml a => a XmlTree XmlTree isRngAttrDatatypeLibrary = hasRngAttName "datatypeLibrary" isRngAttrHref :: ArrowXml a => a XmlTree XmlTree isRngAttrHref = hasRngAttName "href" isRngAttrName :: ArrowXml a => a XmlTree XmlTree isRngAttrName = hasRngAttName "name" isRngAttrNs :: ArrowXml a => a XmlTree XmlTree isRngAttrNs = hasRngAttName "ns" isRngAttrType :: ArrowXml a => a XmlTree XmlTree isRngAttrType = hasRngAttName "type" isRngAttrRelaxSimplificationChanges :: ArrowXml a => a XmlTree XmlTree isRngAttrRelaxSimplificationChanges = hasRngAttName a_relaxSimplificationChanges -- ------------------------------------------------------------ mkRngAttr :: ArrowXml a => String -> a b String -> a b XmlTree mkRngAttr name value = mkAttr (mkName name) (value >>> mkText) mkRngAttrName :: ArrowXml a => String -> a b XmlTree mkRngAttrName value = mkRngAttr "name" (constA value) mkRngAttrRelaxSimplificationChanges :: ArrowXml a => String -> a b XmlTree mkRngAttrRelaxSimplificationChanges value = mkRngAttr a_relaxSimplificationChanges (constA value) mkRngAttrDefineOrigName :: ArrowXml a => String -> a b XmlTree mkRngAttrDefineOrigName value = mkRngAttr defineOrigName (constA value) mkRngAttrContextBase :: ArrowXml a => a b String -> a b XmlTree mkRngAttrContextBase = mkRngAttr contextBaseAttr addRngAttrName :: ArrowXml a => String -> a XmlTree XmlTree addRngAttrName value = addAttr "name" value addRngAttrDescr :: ArrowXml a => String -> a XmlTree XmlTree addRngAttrDescr = addAttr "descr" addRngAttrChanges :: ArrowXml a => String -> a XmlTree XmlTree addRngAttrChanges = addAttr "changes" addRngAttrNs :: ArrowXml a => String -> a XmlTree XmlTree addRngAttrNs = addAttr "ns" rmRngAttrNs :: ArrowXml a => a XmlTree XmlTree rmRngAttrNs = removeAttr "ns" -- ------------------------------------------------------------ hasRngAttrRelaxSimplificationChanges :: ArrowXml a => a XmlTree XmlTree hasRngAttrRelaxSimplificationChanges = hasAttr a_relaxSimplificationChanges 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" -- ------------------------------------------------------------ hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/XMLSchema/0000755000000000000000000000000011701313712020047 5ustar0000000000000000hxt-relaxng-9.1.4/src/Text/XML/HXT/RelaxNG/XMLSchema/DataTypeLibW3C.hs0000644000000000000000000004345311701313712023073 0ustar0000000000000000-- ------------------------------------------------------------ {- | 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 ) ] -- ---------------------------------------- hxt-relaxng-9.1.4/examples/0000755000000000000000000000000011701313713013767 5ustar0000000000000000hxt-relaxng-9.1.4/examples/hparser/0000755000000000000000000000000011701313713015433 5ustar0000000000000000hxt-relaxng-9.1.4/examples/hparser/HXmlParser.hs0000644000000000000000000001300311701313713020011 0ustar0000000000000000-- ------------------------------------------------------------ {- | 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 () -- ------------------------------------------------------------ hxt-relaxng-9.1.4/examples/hparser/Makefile0000644000000000000000000001076311701313713017102 0ustar0000000000000000# $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 hxt-relaxng-9.1.4/examples/hparser/invalid3.rng0000644000000000000000000000070011701313713017651 0ustar0000000000000000 hxt-relaxng-9.1.4/examples/hparser/valid1.xml0000644000000000000000000000000711701313713017332 0ustar0000000000000000 hxt-relaxng-9.1.4/examples/hparser/invalid.xml0000644000000000000000000000034711701313713017607 0ustar0000000000000000 ]> hello world hxt-relaxng-9.1.4/examples/hparser/invalid1.xml0000644000000000000000000000000611701313713017660 0ustar0000000000000000hxt-relaxng-9.1.4/examples/hparser/example1.xml0000644000000000000000000000071011701313713017667 0ustar0000000000000000 ]> hello world äöüß test hxt-relaxng-9.1.4/examples/hparser/valid1.rng0000644000000000000000000000021511701313713017321 0ustar0000000000000000 hxt-relaxng-9.1.4/examples/hparser/invalid2.rng0000644000000000000000000000050111701313713017647 0ustar0000000000000000 hxt-relaxng-9.1.4/examples/hrelaxng/0000755000000000000000000000000011701313713015577 5ustar0000000000000000hxt-relaxng-9.1.4/examples/hrelaxng/simple-qualified.rng0000644000000000000000000000162611701313713021546 0ustar0000000000000000 hxt-relaxng-9.1.4/examples/hrelaxng/Makefile0000644000000000000000000000452011701313713017240 0ustar0000000000000000# $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 example6 : @echo "===> Validate a valid xml file with a valid Relax NG schema with name prefixes" ; echo ; sleep 1 $(prog) ./simple.xml ./simple-qualified.rng @echo example6a : @echo "===> Validate a valid xml file with a valid Relax NG schema without name prefixes" ; echo ; sleep 1 $(prog) ./simple.xml ./simple-unqualified.rng @echo EX = $(wildcard *valid*.xml *valid*.rng simple*.xml simple*.rng) dist : [ -d $(DIST_DIR) ] || mkdir -p $(DIST_DIR) cp $(EX) Makefile $(prog).hs $(DIST_DIR) clean : rm -f $(prog) *.o *.hi # eof ------------------------------------------------------------ hxt-relaxng-9.1.4/examples/hrelaxng/invalid3.rng0000644000000000000000000000070011701313713020015 0ustar0000000000000000 hxt-relaxng-9.1.4/examples/hrelaxng/valid1.xml0000644000000000000000000000000611701313713017475 0ustar0000000000000000hxt-relaxng-9.1.4/examples/hrelaxng/simple-unqualified.rng0000644000000000000000000000143611701313713022110 0ustar0000000000000000 hxt-relaxng-9.1.4/examples/hrelaxng/HRelaxNG.hs0000644000000000000000000000515311701313713017547 0ustar0000000000000000-- | -- 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 () -- ------------------------------------------------------------ hxt-relaxng-9.1.4/examples/hrelaxng/valid2.rng0000644000000000000000000000101711701313713017467 0ustar0000000000000000 2 4 4 hxt-relaxng-9.1.4/examples/hrelaxng/invalid1.xml0000644000000000000000000000000611701313713020024 0ustar0000000000000000hxt-relaxng-9.1.4/examples/hrelaxng/simple.xml0000644000000000000000000000020311701313713017605 0ustar0000000000000000 red die plastic hxt-relaxng-9.1.4/examples/hrelaxng/valid1.rng0000644000000000000000000000021511701313713017465 0ustar0000000000000000 hxt-relaxng-9.1.4/examples/hrelaxng/valid2.xml0000644000000000000000000000004011701313713017474 0ustar0000000000000000hxt-relaxng-9.1.4/examples/hrelaxng/Validate.hs0000644000000000000000000000170311701313713017665 0ustar0000000000000000module Validate where import Data.Maybe import Text.XML.HXT.Core import Text.XML.HXT.RelaxNG loadSchema :: String -> IO (Maybe XmlTree) loadSchema schema = runX ( validateSchemaWithRelax schema ) >>= return . listToMaybe validateWithSchema :: XmlTree -> XmlTree -> Maybe String validateWithSchema schema doc = listToMaybe $ runLA ( validateRelax' schema >>> getErrorMsg ) doc main1 :: String -> String -> IO () main1 sf df = do schema <- loadSchema sf >>= return . fromJust doc <- runX ( readDocument [ withValidate no ] df ) >>= return . head case validateWithSchema schema doc of Just e -> putStrLn $ "Document " ++ show df ++ " is not valid for schema " ++ show sf ++ ": " ++ e Nothing -> putStrLn $ "Document " ++ show df ++ " is valid for schema " ++ show sf main :: IO () main = do main1 "valid1.rng" "valid1.xml" main1 "valid1.rng" "invalid1.xml" hxt-relaxng-9.1.4/examples/hrelaxng/invalid2.rng0000644000000000000000000000050111701313713020013 0ustar0000000000000000