Blame | Letzte Änderung | Log anzeigen | RSS feed
# -*- rnc -*-# RELAX NG Compact Syntax Grammar for the# Atom Format Specification Version 11namespace atom = "http://www.w3.org/2005/Atom"namespace xhtml = "http://www.w3.org/1999/xhtml"namespace s = "http://www.ascc.net/xml/schematron"namespace local = ""start = atomFeed | atomEntry# Common attributesatomCommonAttributes =attribute xml:base { atomUri }?,attribute xml:lang { atomLanguageTag }?,undefinedAttribute*# Text ConstructsatomPlainTextConstruct =atomCommonAttributes,attribute type { "text" | "html" }?,textatomXHTMLTextConstruct =atomCommonAttributes,attribute type { "xhtml" },xhtmlDivatomTextConstruct = atomPlainTextConstruct | atomXHTMLTextConstruct# Person ConstructatomPersonConstruct =atomCommonAttributes,(element atom:name { text }& element atom:uri { atomUri }?& element atom:email { atomEmailAddress }?& extensionElement*)# Date ConstructatomDateConstruct =atomCommonAttributes,xsd:dateTime# atom:feedatomFeed =[s:rule [context = "atom:feed"s:assert [test = "atom:author or not(atom:entry[not(atom:author)])""An atom:feed must have an atom:author unless all "~ "of its atom:entry children have an atom:author."]]]element atom:feed {atomCommonAttributes,(atomAuthor*& atomCategory*& atomContributor*& atomGenerator?& atomIcon?& atomId& atomLink*& atomLogo?& atomRights?& atomSubtitle?& atomTitle& atomUpdated& extensionElement*),atomEntry*}# atom:entryatomEntry =[s:rule [context = "atom:entry"s:assert [test = "atom:link[@rel='alternate'] "~ "or atom:link[not(@rel)] "~ "or atom:content""An atom:entry must have at least one atom:link element "~ "with a rel attribute of 'alternate' "~ "or an atom:content."]]s:rule [context = "atom:entry"s:assert [test = "atom:author or "~ "../atom:author or atom:source/atom:author""An atom:entry must have an atom:author "~ "if its feed does not."]]]element atom:entry {atomCommonAttributes,(atomAuthor*& atomCategory*& atomContent?& atomContributor*& atomId& atomLink*& atomPublished?& atomRights?& atomSource?& atomSummary?& atomTitle& atomUpdated& extensionElement*)}# atom:contentatomInlineTextContent =element atom:content {atomCommonAttributes,attribute type { "text" | "html" }?,(text)*}atomInlineXHTMLContent =element atom:content {atomCommonAttributes,attribute type { "xhtml" },xhtmlDiv}atomInlineOtherContent =element atom:content {atomCommonAttributes,attribute type { atomMediaType }?,(text|anyElement)*}atomOutOfLineContent =element atom:content {atomCommonAttributes,attribute type { atomMediaType }?,attribute src { atomUri },empty}atomContent = atomInlineTextContent| atomInlineXHTMLContent| atomInlineOtherContent| atomOutOfLineContent# atom:authoratomAuthor = element atom:author { atomPersonConstruct }# atom:categoryatomCategory =element atom:category {atomCommonAttributes,attribute term { text },attribute scheme { atomUri }?,attribute label { text }?,undefinedContent}# atom:contributoratomContributor = element atom:contributor { atomPersonConstruct }# atom:generatoratomGenerator = element atom:generator {atomCommonAttributes,attribute uri { atomUri }?,attribute version { text }?,text}# atom:iconatomIcon = element atom:icon {atomCommonAttributes,(atomUri)}# atom:idatomId = element atom:id {atomCommonAttributes,(atomUri)}# atom:logoatomLogo = element atom:logo {atomCommonAttributes,(atomUri)}# atom:linkatomLink =element atom:link {atomCommonAttributes,attribute href { atomUri },attribute rel { atomNCName | atomUri }?,attribute type { atomMediaType }?,attribute hreflang { atomLanguageTag }?,attribute title { text }?,attribute length { text }?,undefinedContent}# atom:publishedatomPublished = element atom:published { atomDateConstruct }# atom:rightsatomRights = element atom:rights { atomTextConstruct }# atom:sourceatomSource =element atom:source {atomCommonAttributes,(atomAuthor*& atomCategory*& atomContributor*& atomGenerator?& atomIcon?& atomId?& atomLink*& atomLogo?& atomRights?& atomSubtitle?& atomTitle?& atomUpdated?& extensionElement*)}# atom:subtitleatomSubtitle = element atom:subtitle { atomTextConstruct }# atom:summaryatomSummary = element atom:summary { atomTextConstruct }# atom:titleatomTitle = element atom:title { atomTextConstruct }# atom:updatedatomUpdated = element atom:updated { atomDateConstruct }# Low-level simple typesatomNCName = xsd:string { minLength = "1" pattern = "[^:]*" }# Whatever a media type is, it contains at least one slashatomMediaType = xsd:string { pattern = ".+/.+" }# As defined in RFC 3066atomLanguageTag = xsd:string {pattern = "[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*"}# Unconstrained; it's not entirely clear how IRI fit into# xsd:anyURI so let's not try to constrain it hereatomUri = text# Whatever an email address is, it contains at least one @atomEmailAddress = xsd:string { pattern = ".+@.+" }# Simple ExtensionsimpleExtensionElement =element * - atom:* {text}# Structured ExtensionstructuredExtensionElement =element * - atom:* {(attribute * { text }+,(text|anyElement)*)| (attribute * { text }*,(text?, anyElement+, (text|anyElement)*))}# Other ExtensibilityextensionElement =simpleExtensionElement | structuredExtensionElementundefinedAttribute =attribute * - (xml:base | xml:lang | local:*) { text }undefinedContent = (text|anyForeignElement)*anyElement =element * {(attribute * { text }| text| anyElement)*}anyForeignElement =element * - atom:* {(attribute * { text }| text| anyElement)*}# XHTMLanyXHTML = element xhtml:* {(attribute * { text }| text| anyXHTML)*}xhtmlDiv = element xhtml:div {(attribute * { text }| text| anyXHTML)*}# EOF