hxt-7.1: doc/cookbook/RDFFunctions.hs
{- |
Module : RDFFunctions
Author : Manuel Ohlendorf
Maintainer : Manuel Ohlendorf
Stability : experimental
Portability: portable
Version :
All RDF related functions, predicates and syntax term definitions
-}
module RDFFunctions
where
import Text.XML.HXT.Arrow
-- namespace definition for RDF and others
-- | Namespace definition for RDF and XML
namespaceXML, namespaceRDF :: String
namespaceRDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
namespaceXML = "http://www.w3.org/XML/1998/namespace"
-- | XML terms
xml_base, xml_lang :: QName
xml_base = mkNsName "xml:base" namespaceXML
xml_lang = mkNsName "xml:lang" namespaceXML
-- | RDF Core Syntax Terms
rdf_RDF,rdf_about,rdf_ID,rdf_resource,rdf_nodeID,rdf_datatype,rdf_parseType :: QName
rdf_RDF = mkNsName "rdf:RDF" namespaceRDF
rdf_about = mkNsName "rdf:about" namespaceRDF
rdf_ID = mkNsName "rdf:ID" namespaceRDF
rdf_resource = mkNsName "rdf:resource" namespaceRDF
rdf_nodeID = mkNsName "rdf:nodeID" namespaceRDF
rdf_datatype = mkNsName "rdf:datatype" namespaceRDF
rdf_parseType = mkNsName "rdf:parseType" namespaceRDF --TODO ParseType Resource => keine BlankNode, kommt in Properties vor
-- | Other RDF Syntax Terms
rdf_Description,rdf_li ::QName
rdf_Description = mkNsName "rdf:Description" namespaceRDF
rdf_li = mkNsName "rdf:li" namespaceRDF
-- | RDF Container Terms
rdf_Seq , rdf_Bag , rdf_Alt :: QName
rdf_Seq = mkNsName "rdf:Seq" namespaceRDF
rdf_Bag = mkNsName "rdf:Bag" namespaceRDF
rdf_Alt = mkNsName "rdf:Alt" namespaceRDF
-- | Allowed Property Names
rdf_Statement,rdf_subject,rdf_predicate,rdf_object,rdf_type,rdf_value,rdf_first,rdf_rest :: QName
rdf_Statement = mkNsName "rdf:Statement"namespaceRDF
rdf_subject = mkNsName "rdf:subject" namespaceRDF
rdf_predicate = mkNsName "rdf:predicate" namespaceRDF
rdf_object = mkNsName "rdf:object" namespaceRDF
rdf_type = mkNsName "rdf:type" namespaceRDF
rdf_value = mkNsName "rdf:value" namespaceRDF
rdf_first = mkNsName "rdf:first" namespaceRDF
rdf_rest = mkNsName "rdf:rest" namespaceRDF
--und: _n where n is a decimal integer greater than zero with no leading zeros.
-- | URI of XML Literals
xmlliteral :: String
xmlliteral = "http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral"
{- Functions for RDF Parsing and Normalizing -}
-- | rdf:RDF test
isRDF :: (ArrowXml a) => a XmlTree XmlTree
isRDF = isElem >>> hasQName rdf_RDF
-- | Tests, wether the element is a node element
isNodeElem :: (ArrowXml a) => a XmlTree XmlTree
isNodeElem = isElem >>> (hasQName rdf_Description >>> (hasQAttr rdf_nodeID `orElse` hasQAttr rdf_about))
-- | Tests, wether the element is a resource element
isResource :: (ArrowXml a) => a XmlTree XmlTree
isResource = isEmptyElem >>> hasQAttr rdf_resource
-- | Checks wether an element is empty or not
isEmptyElem :: (ArrowXml a) => a XmlTree XmlTree
isEmptyElem = (isElem >>> neg getChildren) `guards` this
-- | Tests, wether an element has a datatype definition
hasDatatype :: (ArrowXml a) => a XmlTree XmlTree
hasDatatype = hasQAttr rdf_datatype
-- | Tests, wether an element as rdf:nodeID attribute
hasNodeID :: (ArrowXml a) => a XmlTree XmlTree
hasNodeID = hasQAttr rdf_nodeID
-- | has parse type \"Literal\" or not
hasLiteralParseType :: (ArrowXml a) => a XmlTree XmlTree
hasLiteralParseType = hasQAttrValue rdf_parseType (== "Literal")
-- | has parse type \"Resource\" or not
hasResourceParseType :: (ArrowXml a) => a XmlTree XmlTree
hasResourceParseType = hasQAttrValue rdf_parseType (== "Resource") -- for omitting blank nodes