-- |-- This module provides functions for validating XML documents represented as-- XmlTree.-- Unlike other popular XML validation tools the validation functions return-- a list of errors instead of aborting after the first error was found.-- -- Note: The validation process has been split into validation and transformation!-- If @validate@ did not report any errors, @transform@-- should be called, to change the document the way a validating parser-- is expected to do.---- Author : .\\artin SchmidtmoduleText.XML.HXT.Validator.ValidationFilter(getDTDSubset,validate,validateDTD,validateDoc,removeDoublicateDefs,transform)whereimportText.XML.HXT.DOM.XmlTreeimportqualifiedText.XML.HXT.Validator.DTDValidationasDTDValidationimportqualifiedText.XML.HXT.Validator.DocValidationasDocValidationimportqualifiedText.XML.HXT.Validator.IdValidationasIdValidationimportqualifiedText.XML.HXT.Validator.DocTransformationasDocTransformation-- |-- Main validation filter. Check if the DTD and the document are valid.------ - returns : a function which expects a complete document as XmlTree input-- and returns a list of all errors found.validate::XmlFiltervalidate=validateDTD+++validateDoc-- |-- Check if the DTD is valid.------ - returns : a function which expects an XmlTree from the parser as input-- and returns a list of all errors found in the DTD.validateDTD::XmlFiltervalidateDTD=choice[getDTDSubset:->DTDValidation.validateDTD,this:->err"Can't validate DTD: There is no DOCTYPE declaration in the document."]-- |-- Check if the document corresponds to the given DTD.------ - returns : a function which expects a complete document as XmlTree input-- and returns a list of all errors found in the content part.validateDoc::XmlFiltervalidateDoct=(ifnulldtdsthenerr"Can't validate document: There is no DOCTYPE declaration in the document."else(DocValidation.validateDocdtdPart+++IdValidation.validateIdsdtdPart))$twheredtds=getDTDSubset.>processBottomUpremoveDoublicateDefs$tdtdPart=headdtds-- |-- filter for transforming a document with respect to the given DTD.---- Validating parsers-- are expected to normalize attribute values and add default values.-- This function should be called after a successful validation.------ - returns : a function which expects a complete XML document tree-- and returns the transformed XmlTreetransform::XmlFiltertransform=choice[isRoot:->transformDoc,this:->fatal"Can't transform document: No document root given"]wheretransformDoct|nulldtds=thist|otherwise=DocTransformation.transform(headdtds)twheredtds=getDTDSubset.>processBottomUpremoveDoublicateDefs$t-- |-- Removes doublicate declarations from the DTD which first declaration is-- binding. This is the case for ATTLIST and ENTITY declarations.------ - returns : A function that replaces the children of DOCTYPE nodes by a list-- where all multiple declarations are removed.removeDoublicateDefs::XmlFilterremoveDoublicateDefs=DTDValidation.removeDoublicateDefs---- selects the DTD part of a document-- but only, if there is more than the internal part for the 4 predefined XML entitiesgetDTDSubset::XmlFiltergetDTDSubset=getChildren.>isDoctype.>hasRootNamewherehasRootName=isOf(hasEntrya_name.attrlOfDTD)