<?xml version="1.0" encoding="utf-8" ?>
<schema xmlns="http://www.ascc.net/xml/schematron" >
	<ns prefix="rdf" uri="http://www.w3.org/1999/02/22-rdf-syntax-ns#"/>
	<ns prefix="rss" uri="http://purl.org/rss/1.0/" /> 
	<ns prefix="dc" uri="http://purl.org/dc/elements/1.1/" /> 
	<ns prefix="admin" uri="http://webns.net/mvcb/" />
	<ns prefix="blogChannel" uri="http://backend.userland.com/blogChannelModule" />
	<ns prefix="xs" uri="http://www.w3.org/2001/XMLSchema" />
	<ns prefix="sy" uri="http://purl.org/rss/1.0/modules/syndication/" />
	<ns prefix="content" uri="http://purl.org/rss/1.0/modules/content/" />
	<ns prefix="xhtml" uri="http://www.w3.org/1999/xhtml" />
	<ns prefix="creativeCommons" uri="http://backend.userland.com/creativeCommonsRssModule" />
	<ns prefix="rss09" uri="http://my.netscape.com/rdf/simple/0.9/" />
	<ns prefix="trackback" uri="http://madskills.com/public/xml/rss/module/trackback/" />
	<ns prefix="wfw" uri="http://wellformedweb.org/CommentAPI/" />
	<ns prefix="slash" uri="http://purl.org/rss/1.0/modules/slash/" />
	<ns prefix="atom" uri="http://purl.org/atom/ns#" />
	<ns prefix="dcterms" uri="http://purl.org/dc/terms/" />
	<ns prefix="ent" uri="http://www.purl.org/NET/ENT/1.0/" />
	<ns prefix="l" uri="http://purl.org/rss/1.0/modules/link/" />
	<ns prefix="rdfs" uri="http://www.w3.org/2000/01/rdf-schema#" />	
	<ns prefix="foaf" uri="http://xmlns.com/foaf/0.1/" />
  	<title>Really Simple Validation</title>
	<p>
	Really Simple Validation
	by Randy Charles Morin.
	
	Copyright 2004 Randy Charles Morin.
			
	Credits: Special thanks go to... 
	
	- Leigh Dodds who wrote the original RSS Schematron validator 
		- Website: http://www.ldodds.com/rss_validator/
	- Dave Winer who grandfathered RSS
		- Website: http://www.scripting.com
	- Bernadette Morin who married me and bore my three children (Adelaine, Brayden, Celeste)
		- Website: none
	- Danny Ayers has given me great help figuring out RDF
		- Website: http://www.dannyayers.com
		
	License: This file is public domain. Anybody can use it, except a select few
		companies and individuals that have given me bad jujus thru the years. 
		I reserve the right to expand on this list at any time. The list of 
		companies and individuals who may not use this schema follows...
	
	- Internation Data Group and subsidiaries
		- Website: http://www.idg.com/
		- Reason: IDG published an article of mine and never paid me.
	</p>
	<pattern name="RSS all versions">
		<rule context="/*">
			<assert test="/atom:feed or /rss or /rdf:RDF or /opml or /redirect">
				Root element must be &lt;rss&gt; or &lt;rdf:RDF&gt; or &lt;opml&gt; or &lt;atom:feed&gt; or &lt;redirect&gt;. 
				Root element is <name/>.
			</assert>
		</rule>
	</pattern>
	<pattern name="rdf nodes">
		<rule context="rdf:RDF|rdf:type|rdf:Bay|rdf:Seq|rdf:Alt|rdf:List|rdf:first|rdf:rest|rdf:nil|
				rdf:Statement|rdf:subject|rdf:predicate|rdf:object|rdf:value|rdf:li">
			<asert test="true">
				Nothing.
			</asert>
		</rule>
		<rule context="rdf:*" see="http://web.resource.org/rss/1.0/spec">
			<assert test="false">
				&lt;<name/>&gt; is not a valid rdf namespace element
			</assert>
		</rule>
	</pattern>
	<pattern name="rdfs nodes">
		<rule context="rdfs:Resource|rdfs:Class|rdfs:Literal|rdfs:Datatype|rdfs:XMLLiteral|rdfs:Property|
				rdfs:range|rdfs:domain|rdfs:subClassOf|rdfs:subPropertyOf|rdfs:label|rdfs:comment|
				rdfs:Container|rdfs:ContainerMembershipProperty|rdfs:member|rdfs:seeAlso|rdfs:isDefinedBy">
			<asert test="true">
				Nothing.
			</asert>
		</rule>
		<rule context="rdfs:*" see="http://web.resource.org/rss/1.0/spec">
			<assert test="false">
				&lt;<name/>&gt; is not a valid rdfs namespace element
			</assert>
		</rule>
	</pattern>
	<pattern name="rss 1.0 parents">
   		<rule context="rss:channel|rss:item">
			<assert test="parent::rdf:RDF" see="http://web.resource.org/rss/1.0/spec">
				&lt;<name/>&gt; must have the &lt;rdf:RDF&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert> 
		</rule>
		<rule context="rss:items">
			<assert test="parent::rss:channel" see="http://web.resource.org/rss/1.0/spec">
				&lt;<name/>&gt; must have the &lt;rss:channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert> 
		</rule>
		<rule context="rss:name">
			<assert test="parent::rss:textinput" see="http://web.resource.org/rss/1.0/spec#s5.6.3">
				&lt;<name/>&gt; must have a the &lt;rss:textinput&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="rss:textinput|rss:image">
			<assert test="parent::rdf:RDF or parent::rss:channel" see="http://web.resource.org/rss/1.0/spec">
				&lt;<name/>&gt; must have the &lt;rdf:RDF&gt; or &lt;rss:channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="rss:url">
			<assert test="parent::rss:image" see="http://web.resource.org/rss/1.0/spec#s5.4.2">
				&lt;<name/>&gt; must have a the &lt;rss:image&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="rss:description">
			<assert test="parent::rss:channel or parent::rss:item or parent::rss:textinput" see="http://web.resource.org/rss/1.0/spec">
				&lt;<name/>&gt; must have a the &lt;rss:channel&gt;, &lt;rss:item&gt; or &lt;rss:textinput&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="rss:link|rss:title">
			<assert test="parent::rss:channel or parent::rss:image or parent::rss:item or parent::rss:textinput" see="http://web.resource.org/rss/1.0/spec">
				&lt;<name/>&gt; must have a the &lt;rss:channel&gt;, &lt;rss:image&gt;, &lt;rss:item&gt; or &lt;rss:textinput&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
	</pattern>
	<pattern name="rss 1.0 nodes">
		<rule context="rdf:RDF">
			<report test="rss:*" see="http://web.resource.org/rss/1.0/">
				RSS version 1.0. 
			</report>
			<report test="rss09:*" see="http://www.purplepages.ie/RSS/netscape/rss0.90.html">
				RSS version 0.9. 
				RSS version 0.9 is obsolete.
				You should upgrade to RSS version 2.0.
			</report>
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="not(rss:*) or count(rss:channel)=1" see="http://web.resource.org/rss/1.0/spec#s5.2">
				&lt;<name/>&gt; must have exactly one &lt;rss:channel&gt; child element.
				<value-of select="count(rss:channel|rss09:channel)" /> occurance(s) found.
			</assert>
			<assert test="not(rss09:*) or count(rss09:channel)=1" see="http://web.resource.org/rss/1.0/spec#s5.2">
				&lt;<name/>&gt; must have exactly one &lt;rss:channel&gt; child element.
				<value-of select="count(rss:channel|rss09:channel)" /> occurance(s) found.
			</assert>
			<assert test="not(rss:*) or count(rss:item)&gt;0" see="http://web.resource.org/rss/1.0/spec#s5.2">
				&lt;<name/>&gt; must have at least one &lt;rss:item&gt; child element. 
				<value-of select="count(rss:item|rss09:item)" /> occurance(s) found.
			</assert>
			<assert test="not(rss09:*) or count(rss09:item)&gt;0" see="http://web.resource.org/rss/1.0/spec#s5.2">
				&lt;<name/>&gt; must have at least one &lt;rss:item&gt; child element. 
				<value-of select="count(rss:item|rss09:item)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:image)&lt;2" see="http://web.resource.org/rss/1.0/spec#s5.2">
				&lt;<name/>&gt; must have zero or one &lt;rss:image&gt; child element. 
				<value-of select="count(rss:image)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:textinput)&lt;2" see="http://web.resource.org/rss/1.0/spec#s5.2">
				&lt;<name/>&gt; must have zero or one &lt;rss:textinput&gt; child element. 
				<value-of select="count(rss:textinput)" /> occurance(s) found.
			</assert>
			<report test="count(rss:item)>15" see="http://web.resource.org/rss/1.0/spec#s5.5">
				&lt;<name/>&gt; should have at most 15 &lt;rss:item&gt; child elements.
				<value-of select="count(rss:item)" /> occurance(s) found.
			</report> 
			<assert test="/rdf:RDF[generate-id(.)=generate-id(current())]" see="http://web.resource.org/rss/1.0/spec#s5.2">
				&lt;<name/>&gt; must be the document root element.
			</assert>
   		</rule>
		<rule context="rss:items/rdf:Seq">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
  			<assert test="count(rdf:li)>0" see="http://web.resource.org/rss/1.0/spec#s5.3.5">
  				&lt;<name/>&gt; must have at least one &lt;rdf:li&lt; child element.
				<value-of select="count(rdf:li)" /> occurance(s) found.
  			</assert> 
		</rule>		
		<rule context="rss:items/rdf:Seq/rdf:li">
			<assert test="@rdf:resource" see="http://web.resource.org/rss/1.0/spec#s5.3.5">
				&lt;<name/>&gt; must have a rdf:resource attribute. 
			</assert>
			<assert test="not(@rdf:resource) or /rdf:RDF/rss:item[@rdf:about=current()/@rdf:resource]" see="http://web.resource.org/rss/1.0/spec#s5.3.5">
				&lt;<name/>&gt; must have a &lt;rss:item&gt; element whose rdf:about attribute value is equal to the &lt;<name/>&gt; attribute's rdf:resource attribute value.
			</assert>
		</rule>
   		<rule context="rss:channel">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(rss:title)=1" see="http://web.resource.org/rss/1.0/spec#s5.3">
				&lt;<name/>&gt; must have exactly one &lt;rss:title&gt; child element. 
				<value-of select="count(rss:title)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:link)=1" see="http://web.resource.org/rss/1.0/spec#s5.3">
				&lt;<name/>&gt; must have exactly one &lt;rss:link&gt; child element. 
				<value-of select="count(rss:link)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:description)=1" see="http://web.resource.org/rss/1.0/spec#s5.3">
				&lt;<name/>&gt; must have exactly one &lt;rss:description&gt; child element. 
				<value-of select="count(rss:description)" /> occurance(s) found.
			</assert>
			<assert test="@rdf:about" see="http://web.resource.org/rss/1.0/spec#s5.3">
				&lt;<name/>&gt; must have a rdf:about attribute. 
			</assert>
			<assert test="count(rss:items)=1" see="http://web.resource.org/rss/1.0/spec#s5.3">
				&lt;<name/>&gt; must have exactly one &lt;rss:items&gt; child element. 
				<value-of select="count(rss:items)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:image)&lt;2" see="http://web.resource.org/rss/1.0/spec#s5.3">
				&lt;<name/>&gt; must have zero or one &lt;rss:image&gt; child element. 
				<value-of select="count(rss:image)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:textinput)&lt;2" see="http://web.resource.org/rss/1.0/spec#s5.3">
				&lt;<name/>&gt; must have zero or one &lt;rss:textinput&gt; child element. 
				<value-of select="count(rss:textinput)" /> occurance(s) found.
			</assert>
			<report test="//@rdf:about[.=current()/@rdf:about and generate-id(.)!=generate-id(current()/@rdf:about)]" see="http://web.resource.org/rss/1.0/spec#s5.3">
				The value of a <name/> rdf:about attribute must be unique
				Duplicate value <value-of select="@rdf:about" /> found.
			</report>
   		</rule>
		<rule context="rss:textinput/rss:description">
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.6.2">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="string-length(text())>100" see="http://web.resource.org/rss/1.0/spec#s5.6.2">
				&lt;<name/>&gt; should have at most 100 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
		</rule>
		<rule context="rss:channel/rss:description" see="http://web.resource.org/rss/1.0/spec#s5.3.3">
			<assert test="count(child::*)=0">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="string-length(text())>500" see="http://web.resource.org/rss/1.0/spec#s5.3.3">
				&lt;<name/>&gt; should have at most 500 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
		</rule>
		<rule context="rss:item/rss:description">
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.5.3">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="string-length(text())>500" see="http://web.resource.org/rss/1.0/spec#s5.5.3">
				&lt;<name/>&gt; should have at most 500 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
		</rule>
		<rule context="rss:channel/rss:image">
			<assert test="not(string-length(.))" see="http://web.resource.org/rss/1.0/spec#s5.3.4">
				&lt;<name/>&gt; must not have content.
			</assert>
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.3.4">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="@rdf:resource" see="http://web.resource.org/rss/1.0/spec#s5.3.4">
				&lt;<name/>&gt; must have a rdf:resource attribute. 
			</assert>
		</rule>
		<rule context="rdf:RDF/rss:image">
			<report test="string(normalize-space(text()))" see="http://web.resource.org/rss/1.0/spec#s5.4">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(rss:title)=1" see="http://web.resource.org/rss/1.0/spec#s5.4">
				&lt;<name/>&gt; must have exactly one &lt;rss:title&gt; child element. 
				<value-of select="count(rss:title)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:link)=1" see="http://web.resource.org/rss/1.0/spec#s5.4">
				&lt;<name/>&gt; must have exactly one &lt;rss:link&gt; child element. 
				<value-of select="count(rss:link)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:url)=1" see="http://web.resource.org/rss/1.0/spec#s5.4">
				&lt;<name/>&gt; must have exactly one &lt;rss:url&gt; child element. 
				<value-of select="count(rss:url)" /> occurance(s) found.
			</assert>
			<assert test="@rdf:about" see="http://web.resource.org/rss/1.0/spec#s5.4">
				&lt;<name/>&gt; must have the about attribute.
			</assert> 
			<report test="//@rdf:about[.=current()/@rdf:about and generate-id(.)!=generate-id(current()/@rdf:about)]">
				The value of a <name/> rdf:about attribute must be unique
				Duplicate value <value-of select="@rdf:about" /> found.
			</report> 
			<report test="@rdf:about!=rss:url">
				The value of an <name/> rdf:about attribute should be the same as its url.
				Value of rdf:about is <value-of select="@rdf:about" /> and
				value of rss:url is <value-of select="rss:url" />.
			</report> 
			<assert test="/rdf:RDF/rss:channel/rss:image">
				The &lt;<name/>&gt; child element of &lt;<value-of select="name(.)"/>&gt;, if present, must also be be present as a child element of &lt;rss:channel&gt;.
			</assert>
		</rule>
		<rule context="rss:item">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(rss:title)=1" see="http://web.resource.org/rss/1.0/spec#s5.5">
				&lt;<name/>&gt; must have exactly one &lt;rss:title&gt; child element. 
				<value-of select="count(rss:title)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:link)=1" see="http://web.resource.org/rss/1.0/spec#s5.5">
				&lt;<name/>&gt; must have exactly one &lt;rss:link&gt; child element. 
				<value-of select="count(rss:link)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:description)&lt;2" see="http://web.resource.org/rss/1.0/spec#s5.5">
				&lt;<name/>&gt; must have zero or one &lt;rss:description&gt; child element. 
				<value-of select="count(rss:description)" /> occurance(s) found.
			</assert>
			<assert test="@rdf:about" see="http://web.resource.org/rss/1.0/spec#s5.5">
				&lt;<name/>&gt; must have a rdf:about attribute. 
			</assert>
			<report test="//@rdf:about[.=current()/@rdf:about and generate-id(.)!=generate-id(current()/@rdf:about)]" see="http://web.resource.org/rss/1.0/spec#s5.5">
				The value of a <name/> rdf:about attribute must be unique
				Duplicate value <value-of select="@rdf:about" /> found.
			</report>
		</rule>
		<rule context="rss:items">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(rdf:Seq)=1" see="http://web.resource.org/rss/1.0/spec#s5.3.5">
				&lt;<name/>&gt; must have exactly one &lt;rdf:Seq&gt; child element. 
				<value-of select="count(rdf:Seq)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="rss:channel/rss:link">
			<report test="string-length(text())>500" see="http://web.resource.org/rss/1.0/spec#s5.3.2">
				&lt;<name/>&gt; should have at most 500 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.3.2">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
		</rule>
		<rule context="rss:image/rss:link">
			<report test="string-length(text())>500" see="http://web.resource.org/rss/1.0/spec#s5.4.3">
				&lt;<name/>&gt; should have at most 500 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.4.3">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
		</rule>
		<rule context="rss:item/rss:link">
			<report test="string-length(text())>500" see="http://web.resource.org/rss/1.0/spec#s5.5.2">
				&lt;<name/>&gt; should have at most 500 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.5.2">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
		</rule>
		<rule context="rss:textinput/rss:link">
			<report test="string-length(text())>500" see="http://web.resource.org/rss/1.0/spec#s5.6.4">
				&lt;<name/>&gt; should have at most 500 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.6.4">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
		</rule>
		<rule context="rss:name">
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.6.3">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="string-length(text())>500" see="http://web.resource.org/rss/1.0/spec#s5.6.3">
				&lt;<name/>&gt; should have at most 500 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
		</rule>
		<rule context="rss:channel/rss:textinput">
			<assert test="not(string-length(.))" see="http://web.resource.org/rss/1.0/spec#s5.3.6">
				&lt;<name/>&gt; must not have content.
			</assert>
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.3.6">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="@rdf:resource">
				&lt;<name/>&gt; must have a rdf:resource attribute. 
			</assert>
		</rule>
		<rule context="rdf:RDF/rss:textinput">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(rss:title)=1" see="http://web.resource.org/rss/1.0/spec#s5.6">
				&lt;<name/>&gt; must have exactly one &lt;rss:title&gt; child element. 
				<value-of select="count(rss:title)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:link)=1" see="http://web.resource.org/rss/1.0/spec#s5.6">
				&lt;<name/>&gt; must have exactly one &lt;rss:link&gt; child element. 
				<value-of select="count(rss:link)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:description)=1" see="http://web.resource.org/rss/1.0/spec#s5.6">
				&lt;<name/>&gt; must have exactly one &lt;rss:description&gt; child element. 
				<value-of select="count(rss:desription)" /> occurance(s) found.
			</assert>
			<assert test="count(rss:name)=1" see="http://web.resource.org/rss/1.0/spec#s5.6">
				&lt;<name/>&gt; must have exactly one &lt;rss:name&gt; child element. 
				<value-of select="count(rss:name)" /> occurance(s) found.
			</assert>
			<assert test="@rdf:about" see="http://web.resource.org/rss/1.0/spec#s5.6">
				&lt;<name/>&gt; must have the about attribute.
			</assert>
			<assert test="not(//@rdf:about[.=current()/@rdf:about and generate-id(.)!=generate-id(current()/@rdf:about)])" see="http://web.resource.org/rss/1.0/spec#s5.6">
				The value of a <name/> rdf:about attribute must be unique.
				Duplicate value <value-of select="@rdf:about" /> found.
			</assert> 
			<report test="@rdf:about!=rss:link" see="http://web.resource.org/rss/1.0/spec#s5.6">
				The value of an <name/> rdf:about attribute should be the same as its link.
			</report> 
			<assert test="/rdf:RDF/rss:channel/rss:textinput" see="http://web.resource.org/rss/1.0/spec#s5.6">
				The &lt;<name/>&gt; child element of &lt;<value-of select="name(.)"/>&gt;, if present, must also be be present as a child element of &lt;rss:channel&gt;.
			</assert>
		</rule>
		<rule context="rss:channel/rss:title">
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.3.1">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="string-length(text())>40" see="http://web.resource.org/rss/1.0/spec#s5.3.1">
				&lt;<name/>&gt; should have at most 40 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
		</rule>
		<rule context="rss:textinput/rss:title">
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.6.1">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="string-length(text())>40" see="http://web.resource.org/rss/1.0/spec#s5.6.1">
				&lt;<name/>&gt; should have at most 40 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
		</rule>
		<rule context="rss:image/rss:title">
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.4.1">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="string-length(text())>40" see="http://web.resource.org/rss/1.0/spec#s5.4.1">
				&lt;<name/>&gt; should have at most 40 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
		</rule>
		<rule context="rss:item/rss:title">
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.5.1">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="string-length(text())>100" see="http://web.resource.org/rss/1.0/spec#s5.5.1">
				&lt;<name/>&gt; should have at most 100 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
		</rule>
		<rule context="rss:url">
			<report test="string-length(text())>500" see="http://web.resource.org/rss/1.0/spec#s5.4.2">
				&lt;<name/>&gt; should have at most 500 characters.
				&lt;<name/>&gt; has <value-of select="string-length(text())" /> characters.
			</report>
			<assert test="count(child::*)=0" see="http://web.resource.org/rss/1.0/spec#s5.4.2">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
		</rule>
		<rule context="rss:*" see="http://web.resource.org/rss/1.0/spec">
			<assert test="false">
				&lt;<name/>&gt; is not a valid rss namespace element
			</assert>
		</rule>
	</pattern>
	<pattern name="rss 0.91 and 2.0 parents">
		<rule context="author|comments|enclosure|guid|source">
			<assert test="parent::item" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have a the &lt;item&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="copyright|docs|generator|image|item|language|lastBuildDate|managingEditor|rating|skipDays|skipHours|textinput|textInput|ttl|webMaster">
			<assert test="parent::channel" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have a the &lt;channel&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="category">
			<assert test="parent::channel or parent::item" see="http://blogs.law.harvard.edu/tech/rss">
				&lt;<name/>&gt; must have a the &lt;channel&gt; or &lt;item&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="channel">
			<assert test="parent::rss" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have a the &lt;rss&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="cloud">
			<assert test="not(/rss) or parent::channel" see="http://blogs.law.harvard.edu/tech/rss#ltcloudgtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have a the &lt;channel&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="day">
			<assert test="parent::skipDays" see="http://blogs.law.harvard.edu/tech/skipHoursDays#skipdays">
				&lt;<name/>&gt; must have a the &lt;skipDays&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="description">
			<assert test="parent::channel or parent::item or parent::textinput or parent::textInput or parent::image" see="http://blogs.law.harvard.edu/tech/rss">
				&lt;<name/>&gt; must have a the &lt;channel&gt; or &lt;item&gt; or &lt;image&gt; or &lt;textinput&gt; or &lt;textInput&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="height|url|width">
			<assert test="parent::image" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have a the &lt;image&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="hour">
			<assert test="parent::skipHours" see="http://blogs.law.harvard.edu/tech/skipHoursDays#skiphours">
				&lt;<name/>&gt; must have a the &lt;skipHours&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="link">
			<assert test="parent::channel or parent::item or parent::image or parent::textinput or parent::textInput" see="http://blogs.law.harvard.edu/tech/rss">
				&lt;<name/>&gt; must have a the &lt;channel&gt; or &lt;item&gt; or &lt;image&gt; or &lt;textinput&gt; or &lt;textInput&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="name">
			<assert test="/rss/@version='0.91' or parent::textInput" see="http://blogs.law.harvard.edu/tech/rss#lttextinputgtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have a the &lt;textInput&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="pubDate">
			<assert test="/rss/@version!='2.0' or parent::item or parent::channel" see="http://blogs.law.harvard.edu/tech/rss">
				&lt;<name/>&gt; must have a the &lt;item&gt; or &lt;channel&gt; parent element (RSS 2.0 specific).
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="/rss/@version!='0.91' or parent::channel">
				&lt;<name/>&gt; must have the &lt;channel&gt; parent element (RSS 0.91 specific). 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="title">
			<assert test="not(/rss) or parent::channel or parent::item or parent::image or parent::textinput or parent::textInput" see="http://blogs.law.harvard.edu/tech/rss">
				&lt;<name/>&gt; must have a the &lt;channel&gt; or &lt;item&gt; or &lt;image&gt; or &lt;textinput&gt; or &lt;textInput&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
	</pattern>
	<pattern name="rss 0.91 and 2.0 nodes">
		<rule context="author">
			<assert test="/rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. 
			</assert>
			<report test="child::*">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="category">
			<assert test="/rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. 
			</assert>
		</rule>
		<rule context="channel">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(title)=1" see="http://blogs.law.harvard.edu/tech/rss#requiredChannelElements">
				&lt;<name/>&gt; must have exactly one &lt;title&gt; child element. 
				<value-of select="count(title)" /> occurance(s) found.
			</assert>
			<assert test="count(link)=1" see="http://blogs.law.harvard.edu/tech/rss#requiredChannelElements">
				&lt;<name/>&gt; must have exactly one &lt;link&gt; child element. 
				<value-of select="count(link)" /> occurance(s) found.
			</assert>
			<assert test="count(description)=1" see="http://blogs.law.harvard.edu/tech/rss#requiredChannelElements">
				&lt;<name/>&gt; must have exactly one &lt;description&gt; child element. 
				<value-of select="count(description)" /> occurance(s) found.
			</assert>
			<assert test="count(language)&lt;2 or /rss/@version!='2.0'" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;languagegt; child element (version 2.0 specific). 
				<value-of select="count(language)" /> occurance(s) found.
			</assert>
			<assert test="count(language)=1 or /rss/@version!='0.91'">
				&lt;<name/>&gt; must have exactly one &lt;language&gt; child element (version 0.91 specific). 
				<value-of select="count(language)" /> occurance(s) found.
			</assert>
			<assert test="count(copyright)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;copyright&gt; child element. 
				<value-of select="count(copyright)" /> occurance(s) found.
			</assert>
			<assert test="count(managingEditor)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;managingEditor&gt; child element. 
				<value-of select="count(managingEditor)" /> occurance(s) found.
			</assert>
			<assert test="count(webMaster)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;webMaster&gt; child element. 
				<value-of select="count(webMaster)" /> occurance(s) found.
			</assert>
			<assert test="count(pubDate)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;pubDate&gt; child element. 
				<value-of select="count(pubDate)" /> occurance(s) found.
			</assert>
			<assert test="count(lastBuildDate)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;lastBuildDate&gt; child element. 
				<value-of select="count(lastBuildDate)" /> occurance(s) found.
			</assert>
			<assert test="count(generator)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;generator&gt; child element. 
				<value-of select="count(generator)" /> occurance(s) found.
			</assert>
			<assert test="count(docs)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;docs&gt; child element. 
				<value-of select="count(docs)" /> occurance(s) found.
			</assert>
			<assert test="count(cloud)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;cloud&gt; child element. 
				<value-of select="count(cloud)" /> occurance(s) found.
			</assert>
			<assert test="count(ttl)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;ttl&gt; child element. 
				<value-of select="count(ttl)" /> occurance(s) found.
			</assert>
			<assert test="count(image)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;image&gt; child element. 
				<value-of select="count(image)" /> occurance(s) found.
			</assert>
			<assert test="count(rating)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;rating&gt; child element. 
				<value-of select="count(rating)" /> occurance(s) found.
			</assert>
			<assert test="count(textInput)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;textInput&gt; child element. 
				<value-of select="count(textInput)" /> occurance(s) found.
			</assert>
			<assert test="count(skipHours)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;skipHours&gt; child element. 
				<value-of select="count(skipHours)" /> occurance(s) found.
			</assert>
			<assert test="count(skipDays)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must have zero or one &lt;skipDays&gt; child element. 
				<value-of select="count(skipDays)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="cloud">
			<assert test="not(/rss) or /rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. 
			</assert>
		</rule>
		<rule context="comments">
			<assert test="/rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. 
			</assert>
			<report test="child::*" see="http://blogs.law.harvard.edu/tech/rss#ltcommentsgtSubelementOfLtitemgt">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="copyright">
			<report test="false">
				Nothing.
			</report>
		</rule>
		<rule context="day">
			<assert test=".='Monday' or .='Tuesday' or .='Wednesday' or .='Thursday' or .='Friday' or .='Saturday' or .='Sunday'" see="http://blogs.law.harvard.edu/tech/skipHoursDays#skipdays">
				&lt;<name/>&gt; must be Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday. 
			</assert>
		</rule>
		<rule context="item/description">
			<report test="child::*">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
			<report test="contains(translate(.,'EMBD','embd'),'&lt;embed ') or contains(translate(.,'EMBD','embd'),'&lt;embed&gt;')">
				&lt;<name/>&gt; should not contain an entity-encoded HTML &lt;embed&gt; element.
			</report>
			<report test="contains(translate(.,'META','meta'),'&lt;meta ') or contains(translate(.,'META','meta'),'&lt;meta&gt;')">
				&lt;<name/>&gt; should not contain an entity-encoded HTML &lt;meta&gt; element.
			</report>
			<report test="contains(translate(.,'OBJECT','object'),'&lt;object ') or contains(translate(.,'OBJECT','object'),'&lt;object&gt;')">
				&lt;<name/>&gt; should not contain an entity-encoded HTML &lt;object&gt; element.
			</report>
			<report test="contains(translate(.,'SCRIPT','script'),'&lt;script ') or contains(translate(.,'SCRIPT','script'),'&lt;script&gt;')">
				&lt;<name/>&gt; should not contain an entity-encoded HTML &lt;script&gt; element.
			</report>
		</rule>
		<rule context="description">
			<report test="child::*">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="docs">
			<report test="(.!='http://backend.userland.com/rss' and .!='http://blogs.law.harvard.edu/tech/rss') or /rss/@version!='2.0'" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; should be 'http://blogs.law.harvard.edu/tech/rss'. 
			</report>
		</rule>
		<rule context="enclosure">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="/rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. 
			</assert>
			<assert test="@length" see="http://blogs.law.harvard.edu/tech/rss#ltenclosuregtSubelementOfLtitemgt">
				&lt;<name/>&gt; must have the length attribute.
			</assert>
			<assert test="not(@length) or (number(@length)&gt;0 and not(contains(@length,'.')))" see="http://blogs.law.harvard.edu/tech/rss#ltenclosuregtSubelementOfLtitemgt">
				&lt;<name/>&gt; length attribute must be a positive integer.
			</assert>
			<assert test="@type" see="http://blogs.law.harvard.edu/tech/rss#ltenclosuregtSubelementOfLtitemgt">
				&lt;<name/>&gt; must have the type attribute.
			</assert>
			<assert test="@url" see="http://blogs.law.harvard.edu/tech/rss#ltenclosuregtSubelementOfLtitemgt">
				&lt;<name/>&gt; must have the url attribute.
			</assert>
		</rule>
		<rule context="generator">
			<assert test="/rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. 
			</assert>
		</rule>
		<rule context="guid">
			<assert test="/rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. 
			</assert>
			<assert test="not (@isPermaLink) or @isPermaLink='true' or @isPermaLink='false'" see="http://blogs.law.harvard.edu/tech/rss#ltguidgtSubelementOfLtitemgt">
				&lt;<name/>&gt; isPermaLink must be true or false or not present. 
			</assert>
			<assert test="@isPermaLink='false' or not(//guid[.=current() and generate-id(.)!=generate-id(current())])" see="http://blogs.law.harvard.edu/tech/rss#ltguidgtSubelementOfLtitemgt">
				The value of a &lt;<name/>&gt; should be unique.
				Duplicate value <value-of select="text()" /> found.
			</assert> 
		</rule>
		<rule context="height">
			<assert test="number(.)&gt;0 and number(.)&lt;401 and not(contains(.,'.'))" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must be a number greater than zero and less or equal to 400.
			</assert>
		</rule>
		<rule context="hour">
			<assert test="not(contains(.,'.')) and number(.)&gt;-1 and number(.)&lt;24" see="http://blogs.law.harvard.edu/tech/skipHoursDays#skiphours">
				&lt;<name/>&gt; must be an integer between 0 and 23. 
			</assert>
		</rule>
		<rule context="image">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(url)=1" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have exactly one &lt;url&gt; child element. 
				<value-of select="count(url)" /> occurance(s) found.
			</assert>
			<assert test="count(title)=1" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have exactly one &lt;title&gt; child element. 
				<value-of select="count(title)" /> occurance(s) found.
			</assert>
			<assert test="count(link)=1" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have exactly one &lt;link&gt; child element. 
				<value-of select="count(link)" /> occurance(s) found.
			</assert>
			<assert test="count(description)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have zero or one &lt;description&gt; child element. 
				<value-of select="count(description)" /> occurance(s) found.
			</assert>
			<assert test="count(width)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have zero or one &lt;width&gt; child element. 
				<value-of select="count(width)" /> occurance(s) found.
			</assert>
			<assert test="count(height)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have zero or one &lt;height&gt; child element. 
				<value-of select="count(height)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="item">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(title)&lt;2 or /rss/@version!='2.0'" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;title&gt; child element (RSS version 2.0 specific). 
				<value-of select="count(title)" /> occurance(s) found.
			</assert>
			<assert test="count(title)=1 or /rss/@version!='0.91'">
				&lt;<name/>&gt; must have exactly one &lt;title&gt; child element (RSS version 0.91 specific). 
				<value-of select="count(title)" /> occurance(s) found.
			</assert>
			<assert test="count(description)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;description&gt; child element. 
				<value-of select="count(description)" /> occurance(s) found.
			</assert>
			<assert test="count(link)&lt;2 or /rss/@version!='2.0'" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;link&gt; child element. 
				<value-of select="count(link)" /> occurance(s) found.
			</assert>
			<assert test="count(link)=1 or /rss/@version!='0.91'">
				&lt;<name/>&gt; must have exactly one &lt;link&gt; child element (RSS version 0.91 specific). 
				<value-of select="count(link)" /> occurance(s) found.
			</assert>
			<assert test="(count(title)+count(description))&gt;0 or /rss/@version!='2.0'" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have at least one of title, description. 
			</assert>
			<assert test="count(author)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;author&gt; child element. 
				<value-of select="count(author)" /> occurance(s) found.
			</assert>
			<assert test="count(comments)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;comments&gt; child element. 
				<value-of select="count(comments)" /> occurance(s) found.
			</assert>
			<assert test="count(enclosure)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;enclosure&gt; child element. 
				<value-of select="count(enclosure)" /> occurance(s) found.
			</assert>
			<assert test="count(guid)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;guid&gt; child element. 
				<value-of select="count(guid)" /> occurance(s) found.
			</assert>
			<assert test="count(pubDate)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;pubDate&gt; child element. 
				<value-of select="count(pubDate)" /> occurance(s) found.
			</assert>
			<assert test="count(source)&lt;2" see="http://blogs.law.harvard.edu/tech/rss#hrelementsOfLtitemgt">
				&lt;<name/>&gt; must have zero or one &lt;source&gt; child element. 
				<value-of select="count(source)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="language">
			<assert test="count(child::*)=0" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				&lt;<name/>&gt; must not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<report test="translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='af' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='sq' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='eu' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='be' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='bg' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ca' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='zh-cn' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='zh-tw' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='hr' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='cs' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='da' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='nl' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='nl-be' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='nl-nl' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-bz' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-ca' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-ie' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-jm' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-nz' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-ph' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-za' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-tt' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-gb' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-us' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='en-zw' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='et' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fo' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fi' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fr' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fr-be' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fr-ca' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fr-fr' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fr-lu' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fr-mc' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='fr-ch' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='gl' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='gd' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='de' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='de-at' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='de-de' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='de-li' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='de-lu' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='de-ch' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='el' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='haw' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='hu' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='is' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='in' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ga' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='it' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='it-it' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='it-ch' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ja' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ko' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='mk' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='no' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='pl' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='pt' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='pt-br' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='pt-pt' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ro' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ro-mo' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ro-ro' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ru' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ru-mo' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='ru-ru' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='sr' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='sk' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='sl' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-ar' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-bo' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-cl' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-co' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-cr' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-do' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-ec' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-sv' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-gt' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-hn' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-mx' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-ni' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-pa' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-py' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-pe' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-pr' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-es' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-uy' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='es-ve' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='sv' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='sv-fi' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='sv-se' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='tr' and 
					translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')!='uk'" 
					see="http://blogs.law.harvard.edu/tech/stories/storyReader$15">
				&lt;<value-of select="."/>&gt; is not one of the suggested values for RSS language - http://blogs.law.harvard.edu/tech/stories/storyReader$15.
			</report>
		</rule>
		<rule context="lastBuildDate">
			<report test="child::*" see="http://blogs.law.harvard.edu/tech/rss#optionalChannelElements">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="image/link">
			<assert test="/rss/@version!='0.91' or not(starts-with(.,'https://'))">
				&lt;<name/>&gt; must not start with https:// (RSS 0.91 specific). 
			</assert>
			<report test=".!=//channel/link" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; should be the same value as &lt;channel&gt; &lt;link&gt;.
			</report>
		</rule>
		<rule context="link">
			<assert test="/rss/@version!='0.91' or not(starts-with(.,'https://'))">
				&lt;<name/>&gt; must not start with https:// (RSS 0.91 specific). 
			</assert>
			<report test="child::*" see="http://blogs.law.harvard.edu/tech/rss">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="managingEditor">
			<report test="child::*">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="name">
			<report test="false">
				Nothing.
			</report>
		</rule>
		<rule context="pubDate">
			<report test="child::*" see="http://blogs.law.harvard.edu/tech/rss">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="rating">
			<report test="false">
				Nothing.
			</report>
		</rule>
		<rule context="rss">
			<assert test="/rss[generate-id(.)=generate-id(current())]" see="http://blogs.law.harvard.edu/tech/rss#whatIsRss">
				&lt;<name/>&gt; must be the document root element.
			</assert>
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="@version" see="http://blogs.law.harvard.edu/tech/rss#whatIsRss">
				&lt;<name/>&gt; must have a version attribute. 
			</assert>
			<report test="@version='2.0'" see="http://blogs.law.harvard.edu/tech/rss#whatIsRss">
				RSS version 2.0. 
			</report>
			<report test="@version!='2.0'" see="http://blogs.law.harvard.edu/tech/rss#whatIsRss">
				You should upgrade to RSS version 2.0.
			</report>
			<report test="@version='0.91'">
				RSS version 0.91. 
			</report>
			<report test="@version!='0.91' and @version!='2.0'">
				This validator only works w/ version 0.91, 1.0 and 2.0 of RSS. 
			</report>
			<assert test="count(channel)=1" see="http://blogs.law.harvard.edu/tech/rss#whatIsRss">
				&lt;<name/>&gt; must have exactly one &lt;channel&gt; child element. 
				<value-of select="count(channel)" /> occurance(s) found.
			</assert>
			<report test="descendant-or-self::*/@xml:lang">
				&lt;<name/>&gt; xml:lang attribute rarely supported. Use &lt;language&gt;
			</report>
		</rule>
		<rule context="skipDays">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(day)&lt;8" see="http://blogs.law.harvard.edu/tech/skipHoursDays#skipdays">
				&lt;<name/>&gt; must have at most 7 day child elements.
			</assert>
		</rule>
		<rule context="skipHours">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="count(day)&lt;24" see="http://blogs.law.harvard.edu/tech/skipHoursDays#skipdays">
				&lt;<name/>&gt; must have at most 24 hour child elements.
				<value-of select="count(day)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="source">
			<assert test="@url" see="http://blogs.law.harvard.edu/tech/rss#ltsourcegtSubelementOfLtitemgt">
				&lt;<name/>&gt; must have the url attribute.
			</assert>
			<report test="not(string(.))" see="http://blogs.law.harvard.edu/tech/rss#ltsourcegtSubelementOfLtitemgt">
				&lt;<name/>&gt; should have text content.
			</report>
		</rule>
		<rule context="textinput">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="/rss/@version!='2.0'" see="http://blogs.law.harvard.edu/tech/rss#lttextinputgtSubelementOfLtchannelgt">
				&lt;<name/>&gt; is not a valid RSS 2.0 element. Use textInput (capitalization).
			</assert>
			<assert test="count(title)=1">
				&lt;<name/>&gt; must have exactly one &lt;title&gt; child element. 
				<value-of select="count(title)" /> occurance(s) found.
			</assert>
			<assert test="count(description)=1">
				&lt;<name/>&gt; must have exactly one &lt;description&gt; child element. 
				<value-of select="count(description)" /> occurance(s) found.
			</assert>
			<assert test="count(name)=1">
				&lt;<name/>&gt; must have exactly one &lt;name&gt; child element. 
				<value-of select="count(name)" /> occurance(s) found.
			</assert>
			<assert test="count(link)=1">
				&lt;<name/>&gt; must have exactly one &lt;link&gt; child element. 
				<value-of select="count(link)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="textInput">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="/rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. Use textinput (capitalization).
			</assert>
			<assert test="count(title)=1" see="http://blogs.law.harvard.edu/tech/rss#lttextinputgtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have exactly one &lt;title&gt; child element. 
				<value-of select="count(title)" /> occurance(s) found.
			</assert>
			<assert test="count(description)=1" see="http://blogs.law.harvard.edu/tech/rss#lttextinputgtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have exactly one &lt;description&gt; child element. 
				<value-of select="count(description)" /> occurance(s) found.
			</assert>
			<assert test="count(name)=1" see="http://blogs.law.harvard.edu/tech/rss#lttextinputgtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have exactly one &lt;name&gt; child element. 
				<value-of select="count(name)" /> occurance(s) found.
			</assert>
			<assert test="count(link)=1" see="http://blogs.law.harvard.edu/tech/rss#lttextinputgtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must have exactly one &lt;link&gt; child element. 
				<value-of select="count(link)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="image/title">
			<report test=".!=//channel/title" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; should be the same value as &lt;channel&gt; &lt;title&gt;.
			</report>
			<report test="child::*">
				&lt;<name/>&gt; should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
			<report test="not(string(.))" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; should contain text content.
			</report>
		</rule>
		<rule context="title">
			<report test="/rss and child::*">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="ttl">
			<assert test="/rss/@version!='0.91'">
				&lt;<name/>&gt; is not a valid RSS 0.91 element. 
			</assert>
			<assert test="number(.)&gt;0 and not(contains(.,'.'))" see="http://blogs.law.harvard.edu/tech/rss#ltttlgtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must be a positive integer.
			</assert>
		</rule>
		<rule context="url">
			<assert test="/rss/@version!='0.91' or not(starts-with(.,'https://'))">
				&lt;<name/>&gt; must not start with https:// (RSS 0.91 specific). 
			</assert>
		</rule>
		<rule context="webMaster">
			<report test="child::*">
				<name/> should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
		</rule>
		<rule context="width">
			<assert test="number(.)&gt;0 and number(.)&lt;145 and not(contains(.,'.'))" see="http://blogs.law.harvard.edu/tech/rss#ltimagegtSubelementOfLtchannelgt">
				&lt;<name/>&gt; must be a number greater than zero and less or equal to 144.
			</assert>
		</rule>
		<rule context="*">
			<assert test="not(/rss) or string(namespace-uri())" see="http://blogs.law.harvard.edu/tech/rss">
				&lt;<name/>&gt; is not a valid rss element
			</assert>
		</rule>
	</pattern>
	<pattern name="RSS redirect">
		<rule context="redirect">
			<assert test="not(/redirect) or /redirect[generate-id(.)=generate-id(current())]" see="http://radio.userland.com/stories/storyReader$19964">
				&lt;<name/>&gt; must be the document root element.
			</assert>
			<report test="/redirect[generate-id(.)=generate-id(current())]" see="http://radio.userland.com/stories/storyReader$19964">
				RSS 2.0 redirect. 
			</report>
			<assert test="not(/redirect) or count(newLocation)=1">
				&lt;<name/>&gt; must have exactly one &lt;newLocation&gt; child element.
				<value-of select="count(newLocation)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="newLocation">
			<assert test="not(/redirect) or parent::redirect" see="http://radio.userland.com/stories/storyReader$19964">
				&lt;<name/>&gt; must have a the &lt;redirect&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="*">
			<assert test="not(/redirect)" see="http://radio.userland.com/stories/storyReader$19964">
				&lt;<name/>&gt; is not a valid RSS redirect element
			</assert>
		</rule>
	</pattern>
	<pattern name="rss 1.0 admin module">
		<rule context="admin:errorReportsTo">
			<assert test="not(/rss or /rdf:RDF/rss:* or /rdf:RDF/rss09:*) or 
					parent::rss:channel or parent::channel" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name/>&gt; must have the &lt;rss:channel&gt; or &lt;channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="@rdf:resource" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name/>&gt; must have a rdf:resource attribute. 
			</assert>
			<report test="parent::channel" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name/>&gt; in RSS 2.0 is funky, use webMaster.
			</report>
		</rule>
		<rule context="admin:generatorAgent">
			<assert test="not(/rss or /rdf:RDF/rss:* or /rdf:RDF/rss09:*) or 
					parent::rss:channel or parent::channel" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name/>&gt; must have the &lt;rss:channel&gt; or &lt;channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="@rdf:resource" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name/>&gt; must have a rdf:resource attribute. 
			</assert>
			<report test="parent::channel" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name/>&gt; in RSS 2.0 is funky, use generator.
			</report>
		</rule>
		<rule context="admin:*">
			<assert test="false" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name/>&gt; is not a valid admin namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="blogChannel module">
		<rule context="blogChannel:*">
			<assert test="parent::channel">
				&lt;<name/>&gt; must have the &lt;channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="not(blogChannel:blogRoll or blogChannel:mySubscriptions or blogChannel:blink or blogChannel:changes)">
				&lt;<name/>&gt; is not a valid blogChannel namespace element
			</assert>
		</rule>
	</pattern>
	<pattern name="dublin core extension">
		<rule context="dc:date" see="http://dublincore.org/documents/dces/">
			<assert test="not(@*[name()!='xml:lang' and name()!='xml:space' and name()!='rdf:parseType' and name()!='rdf:dataType' and name()!='rdf:ID' and name()!='rdf:resource'])" 
					see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must only have the xml:lang, xml:space, rdf:parseType, rdf:dataType, rdf:ID and rdf:resource attributes.
			</assert>
			<assert test="not(@rdf:resource) or not(string-length(.)&gt;0 or child::*)" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must not have both content and the rdf:resource attribute.
			</assert>
			<report test="count(child::*)>0" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
			<report test="parent::item or parent::channel" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use pubDate.
			</report>
		</rule>
		<rule context="dc:language">
			<assert test="not(@*[name()!='xml:lang' and name()!='xml:space' and name()!='rdf:parseType' and name()!='rdf:dataType' and name()!='rdf:ID' and name()!='rdf:resource'])" 
					see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must only have the xml:lang, xml:space, rdf:parseType, rdf:dataType, rdf:ID and rdf:resource attributes.
			</assert>
			<assert test="not(@rdf:resource) or not(string-length(.)&gt;0 or child::*)" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must not have both content and the rdf:resource attribute.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must not be empty.
			</assert>
			<report test="count(child::*)>0" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; should not contain child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</report>
			<assert test="not(parent::channel/language) or parent::channel/language/text()=text()" see="http://dublincore.org/documents/dces/">
				If both &lt;<name path=".."/>/<name/>&gt; and &lt;language&gt; are present, they must be equal.
			</assert>
			<report test="parent::channel" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use language.
			</report>
		</rule>
		<rule context="dc:subject|dc:publisher|dc:contributor|dc:type|dc:format|dc:identifier|dc:source|dc:relation|dc:coverage">
			<assert test="not(@*[name()!='xml:lang' and name()!='xml:space' and name()!='rdf:parseType' and name()!='rdf:dataType' and name()!='rdf:ID' and name()!='rdf:resource'])" 
					see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must only have the xml:lang, xml:space, rdf:parseType, rdf:dataType, rdf:ID and rdf:resource attributes.
			</assert>
			<assert test="not(@rdf:resource) or not(string-length(.)&gt;0 or child::*)" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must not have both content and the rdf:resource attribute.
			</assert>
		</rule>
		<rule context="dc:description">
			<assert test="not(@*[name()!='xml:lang' and name()!='xml:space' and name()!='rdf:parseType' and name()!='rdf:dataType' and name()!='rdf:ID' and name()!='rdf:resource'])" 
					see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must only have the xml:lang, xml:space, rdf:parseType, rdf:dataType, rdf:ID and rdf:resource attributes.
			</assert>
			<assert test="not(@rdf:resource) or not(string-length(.)&gt;0 or child::*)" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must not have both content and the rdf:resource attribute.
			</assert>
			<report test="parent::rss:channel/rss:description or parent::rss:item/rss:description">
				Using both &lt;<name path=".."/>/<name/>&gt; and &lt;rss:title&gt; is redundant.
			</report>
			<report test="parent::channel or parent::item" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use description.
			</report>
		</rule>
		<rule context="dc:title">
			<assert test="not(@*[name()!='xml:lang' and name()!='xml:space' and name()!='rdf:parseType' and name()!='rdf:dataType' and name()!='rdf:ID' and name()!='rdf:resource'])" 
					see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must only have the xml:lang, xml:space, rdf:parseType, rdf:dataType, rdf:ID and rdf:resource attributes.
			</assert>
			<assert test="not(@rdf:resource) or not(string-length(.)&gt;0 or child::*)" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must not have both content and the rdf:resource attribute.
			</assert>
			<report test="parent::channel or parent::item" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use title.
			</report>
			<report test="parent::rss:channel/rss:title or parent::rss:item/rss:title">
				Using both &lt;<name path=".."/>/<name/>&gt; and &lt;rss:title&gt; is redundant.
			</report>
		</rule>
		<rule context="dc:creator">
			<assert test="not(@*[name()!='xml:lang' and name()!='xml:space' and name()!='rdf:parseType' and name()!='rdf:dataType' and name()!='rdf:ID' and name()!='rdf:resource'])" 
					see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must only have the xml:lang, xml:space, rdf:parseType, rdf:dataType, rdf:ID and rdf:resource attributes.
			</assert>
			<assert test="not(@rdf:resource) or not(string-length(.)&gt;0 or child::*)" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must not have both content and the rdf:resource attribute.
			</assert>
			<report test="parent::channel" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use managingEditor.
			</report>
			<report test="parent::item" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use author.
			</report>
		</rule>
		<rule context="dc:rights">
			<assert test="not(@*[name()!='xml:lang' and name()!='xml:space' and name()!='rdf:parseType' and name()!='rdf:dataType' and name()!='rdf:ID' and name()!='rdf:resource'])" 
					see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must only have the xml:lang, xml:space, rdf:parseType, rdf:dataType, rdf:ID and rdf:resource attributes.
			</assert>
			<assert test="not(@rdf:resource) or not(string-length(.)&gt;0 or child::*)" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; must not have both content and the rdf:resource attribute.
			</assert>
			<report test="parent::channel" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use copyright.
			</report>
		</rule>
		<rule context="dc:*">
			<assert test="false" see="http://dublincore.org/documents/dces/">
				&lt;<name path=".."/>/<name/>&gt; is not a valid dublin core namespace element
			</assert>
		</rule>
	</pattern>
	<pattern name="syndication module">
		<rule context="sy:updatePeriod">
			<assert test="parent::rss:channel or parent::channel" see="http://web.resource.org/rss/1.0/modules/syndication/">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:channel&gt; or &lt;channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test=".='hourly' or .='daily' or .='weekly' or .='monthly' or .='yearly'" see="http://web.resource.org/rss/1.0/modules/syndication/">
				&lt;<name path=".."/>/<name/>&gt; must be hourly, daily, weekly, monthly or yearly. 
			</assert>
			<report test="parent::channel" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use ttl.
			</report>
		</rule>
		<rule context="sy:updateFrequency">
			<assert test="parent::rss:channel or parent::channel" see="http://web.resource.org/rss/1.0/modules/syndication/">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:channel&gt; or &lt;channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="not(contains(.,'.')) and number(.)&gt;0" see="http://web.resource.org/rss/1.0/modules/syndication/">
				&lt;<name path=".."/>/<name/>&gt; must be a positive integer.
			</assert>
			<report test="parent::channel" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use ttl.
			</report>
		</rule>
		<rule context="sy:updateBase">
			<assert test="parent::rss:channel or parent::channel" see="http://web.resource.org/rss/1.0/modules/syndication/">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:channel&gt; or &lt;channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="sy:*">
			<assert test="false" see="http://web.resource.org/rss/1.0/modules/syndication/">
				&lt;<name path=".."/>/<name/>&gt; is not a valid syndication namespace element
			</assert>
		</rule>
	</pattern>
	<pattern name="content module">
		<rule context="content:encoded">
			<assert test="parent::rss:item or parent::item" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:item&gt; or &lt;item&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<report test="parent::item" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use description.
			</report>
			<report test="contains(translate(.,'EMBD','embd'),'&lt;embed ') or contains(translate(.,'EMBD','embd'),'&lt;embed&gt;')">
				&lt;<name path=".."/>/<name/>&gt; should not contain an entity-encoded HTML &lt;embed&gt; element.
			</report>
			<report test="contains(translate(.,'META','meta'),'&lt;meta ') or contains(translate(.,'META','meta'),'&lt;meta&gt;')">
				&lt;<name path=".."/>/<name/>&gt; should not contain an entity-encoded HTML &lt;meta&gt; element.
			</report>
			<report test="contains(translate(.,'OBJECT','object'),'&lt;object ') or contains(translate(.,'OBJECT','object'),'&lt;object&gt;')">
				&lt;<name path=".."/>/<name/>&gt; should not contain an entity-encoded HTML &lt;object&gt; element.
			</report>
			<report test="contains(translate(.,'SCRIPT','script'),'&lt;script ') or contains(translate(.,'SCRIPT','script'),'&lt;script&gt;')">
				&lt;<name path=".."/>/<name/>&gt; should not contain an entity-encoded HTML &lt;script&gt; element.
			</report>
		</rule>
		<rule context="content:items">
			<assert test="parent::rss:item or parent::rss:channel" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:item&gt; or &lt;rss:channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="count(rdf:Bag)=1" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name path=".."/>/<name/>&gt; must have exactly one &lt;rdf:Bag&gt; child element. 
			</assert>
		</rule>
		<rule context="content:item">
			<report test="//@rdf:about[.=current()/@rdf:about and generate-id(.)!=generate-id(current()/@rdf:about)]"
					 see="http://web.resource.org/rss/1.0/modules/admin/">
				The value of a <name/> rdf:about attribute must be unique
				Duplicate value <value-of select="@rdf:about" /> found.
			</report>
			<assert test="count(content:format)=1" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name path=".."/>/<name/>&gt; must have exactly one &lt;content:format&gt; child element. 
				<value-of select="count(content:format)" /> occurance(s) found.
			</assert>
			<assert test="count(content:encoding)&lt;2" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;content:encoding&gt; child element. 
				<value-of select="count(content:encoding)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="content:format">
			<assert test="@rdf:resource" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rdf:resource&gt; attribute. 
			</assert>
		</rule>
		<rule context="content:encoding">
			<assert test="@rdf:resource" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rdf:resource&gt; attribute. 
			</assert>
		</rule>
		<rule context="content:*">
			<assert test="false" see="http://web.resource.org/rss/1.0/modules/admin/">
				&lt;<name path=".."/>/<name/>&gt; is not a valid content namespace element
			</assert>
		</rule>
	</pattern>
	<pattern name="xhtml namespace">
		<rule context="xhtml:body">
			<report test="parent::item" see="http://www.kbcafe.com/iBLOGthere4iM/?guid=20030619225318">
				&lt;<name path=".."/>/<name/>&gt; in RSS 2.0 is funky, use description.
			</report>
			<report test="descendant::xhtml:embed">
				&lt;<name path=".."/>/<name/>&gt; should not have an &lt;xhtml:embed&gt; descendant element.
			</report>
			<report test="descendant::xhtml:meta">
				&lt;<name path=".."/>/<name/>&gt; should not have an &lt;xhtml:meta&gt; descendant element.
			</report>
			<report test="descendant::xhtml:object">
				&lt;<name path=".."/>/<name/>&gt; should not have an &lt;xhtml:object&gt; descendant element.
			</report>
			<report test="descendant::xhtml:script">
				&lt;<name path=".."/>/<name/>&gt; should not have an &lt;xhtml:script&gt; descendant element.
			</report>
		</rule>
	</pattern>
	<pattern name="creativeCommons namespace">
		<rule context="creativeCommons:license">
			<assert test="parent::item or parent::rss:item or parent::channel or parent::rss:channel" see="http://backend.userland.com/creativeCommonsRssModule">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;item&gt; or &lt;rss:item&gt; or &lt;channel&gt; or &lt;rss:channel&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="starts-with(., 'http://') or starts-with(., 'https://') or starts-with(., 'ftp://')" see="http://backend.userland.com/creativeCommonsRssModule">
				&lt;<name path=".."/>/<name/>&gt; must be a URL.
			</assert>
		</rule>
		<rule context="creativeCommons:*">
			<assert test="false" see="http://backend.userland.com/creativeCommonsRssModule">
				&lt;<name path=".."/>/<name/>&gt; is not a valid creativeCommons namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="trackback module">
		<rule context="trackback:ping">
			<assert test="parent::item or parent::rss:item">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:item&gt; or &lt;item&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="count(parent::item/trackback:ping)=1 or count(parent::rss:item/trackback:ping)=1">
				&lt;<name path=".."/>/<name/>&gt; must be the only &lt;<name/>&gt; element within the parent element. 
			</assert>
			<assert test="/rss/@version!='2.0' or starts-with(., 'http://') or starts-with(., 'https://')">
				&lt;<name path=".."/>/<name/>&gt; must be an HTTP URL (RSS 2.0 specific).
			</assert>
			<assert test="namespace-uri(parent::item)!='http://purl.org/rss/1.0/' or starts-with(@rdf:resource, 'http://') or starts-with(@rdf:resource, 'https://')">
				&lt;<name path=".."/>/<name/>&gt; @rdf:resource attribute must be an HTTP URL (RSS 1.0 specific).
			</assert>
			<assert test="namespace-uri(parent::item)!='http://purl.org/rss/1.0/' or @rdf:resource">
				&lt;<name path=".."/>/<name/>&gt; must have an @rdf:resource attribute (RSS 1.0 specific).
			</assert>
		</rule>
		<rule context="trackback:about">
			<assert test="parent::item or parent::rss:item">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:item&gt; or &lt;item&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="/rss/@version!='2.0' or starts-with(., 'http://') or starts-with(., 'https://')">
				&lt;<name path=".."/>/<name/>&gt; must be an HTTP URL (RSS 2.0 specific).
			</assert>
			<assert test="namespace-uri(parent::item)!='http://purl.org/rss/1.0/' or starts-with(@rdf:resource, 'http://') or starts-with(@rdf:resource, 'https://')">
				&lt;<name path=".."/>/<name/>&gt; @rdf:resource attribute must be an HTTP URL (RSS 1.0 specific).
			</assert>
			<assert test="namespace-uri(parent::item)!='http://purl.org/rss/1.0/' or @rdf:resource">
				&lt;<name path=".."/>/<name/>&gt; must have an @rdf:resource attribute (RSS 1.0 specific).
			</assert>
		</rule>
		<rule context="trackback:*">
			<assert test="false">
				&lt;<name path=".."/>/<name/>&gt; is not a valid trackback namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="well formed web namespace">
		<rule context="wfw:comment|wfw:commentRSS|wfw:commentRss">
			<assert test="parent::item or parent::rss:item">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:item&gt; or &lt;item&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="starts-with(., 'http://') or starts-with(., 'https://')">
				&lt;<name path=".."/>/<name/>&gt; must be an HTTP URL.
			</assert>
			<report test="name()='wfw:commentRss'">
				&lt;<name path=".."/>/<name/>&gt; should be commentRSS (capitalization).
			</report>
		</rule>
		<rule context="wfw:*">
			<assert test="false">
				&lt;<name path=".."/>/<name/>&gt; is not a valid well formed web namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="slash namespace">
		<rule context="slash:section|slash:department|slash:hit_parade">
			<assert test="parent::item or parent::rss:item">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:item&gt; or &lt;item&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="slash:comments">
			<assert test="parent::item or parent::rss:item">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:item&gt; or &lt;item&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="number(.)&gt;-1 and not(contains(.,'.'))">
				&lt;<name path=".."/>/<name/>&gt; must be an non-negative integer.
			</assert>
		</rule>
		<rule context="slash:*">
			<assert test="false">
				&lt;<name path=".."/>/<name/>&gt; is not a valid well formed web namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="opml format">
		<rule context="opml">
			<assert test="/opml[generate-id(.)=generate-id(current())]">
				&lt;<name/>&gt; must be the document root element.
			</assert>
			<assert test="@version" see="http://www.opml.org/spec#whatIsAnLtopmlgt">
				&lt;<name/>&gt; must have a version attribute.
			</assert>
			<report test="@version!='1.0' and @version!='1.1'" see="http://www.opml.org/spec#whatIsAnLtopmlgt">
				This validator only supports OPML version 1.0 and 1.1.
				OPML version number is <value-of select="@version"/>.
			</report>
			<assert test="count(head)=1" see="http://www.opml.org/spec#whatIsAnLtopmlgt">
				&lt;<name/>&gt; must have exactly one &lt;head&gt; child element. 
				<value-of select="count(head)" /> occurance(s) found.
			</assert>
			<assert test="count(body)=1" see="http://www.opml.org/spec#whatIsAnLtopmlgt">
				&lt;<name/>&gt; must have exactly one &lt;body&gt; child element. 
				<value-of select="count(body)" /> occurance(s) found.
			</assert>
			<assert test="not(@version) or (number(@version) and contains(@version,'.') and
				number(substring-before(@version,'.'))&gt;0 and
				number(substring-after(@version,'.'))&gt;-1 and
				not(contains(substring-after(@version,'.'),'.')))" see="http://www.opml.org/spec#whatIsAnLtopmlgt">
				&lt;<name/>&gt; version attribute must be a number (format x.y).
			</assert>
			<report test="@version='1.0'" see="http://www.opml.org/spec#whatIsAnLtopmlgt">
				OPML version 1.0.
			</report>
			<report test="@version='1.1'">
				OPML version 1.1.
			</report>
		</rule>
		<rule context="head">
			<assert test="parent::opml">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;opml&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="count(title)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;title&gt; child element. 
				<value-of select="count(title)" /> occurance(s) found.
			</assert>
			<assert test="count(dateCreated)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;dateCreated&gt; child element. 
				<value-of select="count(dateCreated)" /> occurance(s) found.
			</assert>
			<assert test="count(dateModified)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;dateModified&gt; child element. 
				<value-of select="count(dateModified)" /> occurance(s) found.
			</assert>
			<assert test="count(ownerName)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;ownerName&gt; child element. 
				<value-of select="count(ownerName)" /> occurance(s) found.
			</assert>
			<assert test="count(ownerEmail)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;ownerEmail&gt; child element. 
				<value-of select="count(ownerEmail)" /> occurance(s) found.
			</assert>
			<assert test="count(expansionState)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;expansionState&gt; child element. 
				<value-of select="count(expansionState)" /> occurance(s) found.
			</assert>
			<assert test="count(vertScrollState)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;vertScrollState&gt; child element. 
				<value-of select="count(vertScrollState)" /> occurance(s) found.
			</assert>
			<assert test="count(windowTop)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;windowTop&gt; child element. 
				<value-of select="count(windowTop)" /> occurance(s) found.
			</assert>
			<assert test="count(windowLeft)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;windowLeft&gt; child element. 
				<value-of select="count(windowLeft)" /> occurance(s) found.
			</assert>
			<assert test="count(windowBottom)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;windowBottom&gt; child element. 
				<value-of select="count(windowBottom)" /> occurance(s) found.
			</assert>
			<assert test="count(windowRight)&lt;2" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;windowRight&gt; child element. 
				<value-of select="count(windowRight)" /> occurance(s) found.
			</assert>
			<assert test="count(cloud)&lt;2" see="http://www.opml.org/stories/storyReader$11">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;cloud&gt; child element. 
				<value-of select="count(cloud)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="title|dateCreated|dateModified|ownerName|ownerEmail|expansionState">
			<assert test="not(/opml) or parent::head" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;head&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="cloud">
			<assert test="not(/opml) or parent::head" see="http://www.opml.org/stories/storyReader$11">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;head&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="vertScrollState|windowTop|windowLeft|windowBottom|windowRight">
			<assert test="not(/opml) or parent::head">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;head&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="number(.)&gt;-1 and not(contains(.,'.'))" see="http://www.opml.org/spec#whatIsALtheadgt">
				&lt;<name path=".."/>/<name/>&gt; must be a non-negative integer.
				Value is <value-of select="."/>.
			</assert>
		</rule>
		<rule context="body">
			<assert test="parent::opml">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;opml&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<asser test="count(outline)&gt;1" see="http://www.opml.org/spec#whatIsALtbodygt">
				&lt;<name path=".."/>/<name/>&gt; must have at least one &lt;outline&gt; child element. 
				<value-of select="count(outline)" /> occurance(s) found.
			</asser>
		</rule>
		<rule context="outline">
			<assert test="parent::outline or parent::body">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;body&gt; or &lt;outline&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="not(@isComment) or @isComment='true' or @isComment='false'" see="http://www.opml.org/spec#commonAttributes">
				&lt;<name path=".."/>/<name/>&gt; must be true or false.
				Value is <value-of select="."/>.
			</assert>
			<assert test="not(@isBreakpoint) or @isBreakpoint='true' or @isBreakpoint='false'" see="http://www.opml.org/spec#commonAttributes">
				&lt;<name path=".."/>/<name/>&gt; must be true or false.
				Value is <value-of select="."/>.
			</assert>
			<report test="@title and not(@text)" see="http://www.opml.org/spec#commonAttributes">
				&lt;<name path=".."/>/<name/>&gt; title attribute is unspecified, use text instead.
			</report>
		</rule>
		<rule context="*">
			<assert test="not(/opml)" see="http://www.opml.org/spec">
				&lt;<name path=".."/>/<name/>&gt; is not a valid opml element
			</assert>
		</rule>
	</pattern>
	<pattern name="atom namespace">
		<rule context="atom:feed">
			<assert test="/atom:feed[generate-id(.)=generate-id(current())]">
				&lt;<name/>&gt; must be the document root element.
			</assert>	
			<report test="@version='0.3'">
				Atom version 0.3.				
			</report>
			<report test="@version!='0.3'">
				The validator only works with Atom version 0.3. 
				Version is <value-of select="@version"/>.
			</report>
			<assert test="@version">
				&lt;<name/>&gt; must have a version attribute.
			</assert>
			<assert test="count(atom:title)=1">
				&lt;<name/>&gt; must have exactly one &lt;atom:title&gt; child element. 
				<value-of select="count(atom:title)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:link[@rel='alternate'])&gt;0">
				&lt;<name/>&gt; must have at least one &lt;atom:link&gt; child element with the rel attribute of 'alternate'.
				<value-of select="count(atom:link[@rel='alternate'])" /> occurance(s) found.
			</assert>
			<assert test="count(atom:author)&lt;2">
				&lt;<name/>&gt; must have zero or one &lt;atom:author&gt; child element.
				<value-of select="count(atom:author)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:tagline)&lt;2">
				&lt;<name/>&gt; must have zero or one &lt;atom:tagline&gt; child element. 
				<value-of select="count(atom:tagline)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:id)&lt;2">
				&lt;<name/>&gt; must have zero or one &lt;atom:id&gt; child element. 
				<value-of select="count(atom:id)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:generator)&lt;2">
				&lt;<name/>&gt; must have zero or one &lt;atom:generator&gt; child element. 
				<value-of select="count(atom:generator)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:copyright)&lt;2">
				&lt;<name/>&gt; must have zero or one &lt;atom:copyright&gt; child element. 
				<value-of select="count(atom:copyright)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:info)&lt;2">
				&lt;<name/>&gt; must have zero or one &lt;atom:info&gt; child element. 
				<value-of select="count(atom:info)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:modified)=1">
				&lt;<name/>&gt; must have exactly one &lt;atom:modified&gt; child element. 
				<value-of select="count(atom:modified)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:entry)&gt;0">
				&lt;<name/>&gt; must have at least one &lt;atom:entry&gt; child element. 
				<value-of select="count(atom:entry)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="atom:entry">
			<assert test="parent::atom:feed">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="count(atom:title)=1">
				&lt;<name path=".."/>/<name/>&gt; must have exactly one &lt;atom:title&gt; child element. 
				<value-of select="count(atom:title)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:link[@rel='alternate'])&gt;0">
				&lt;<name path=".."/>/<name/>&gt; must have at least one &lt;atom:link&gt; child element with the rel attribute of 'alternate'.
				<value-of select="count(atom:link[@rel='alternate'])" /> occurance(s) found.
			</assert>
			<assert test="count(atom:author)&lt;2">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;atom:author&gt; child element.
				<value-of select="count(atom:author)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:author)=1 or /atom:feed/atom:author">
				&lt;<name path=".."/>/<name/>&gt; must have an &lt;atom:author&gt; child element, if atom:feed does not have an atom:author child element.
			</assert>
			<assert test="count(atom:id)&lt;2">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;atom:id&gt; child element. 
				<value-of select="count(atom:id)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:modified)=1">
				&lt;<name path=".."/>/<name/>&gt; must have exactly one &lt;atom:modified&gt; child element. 
				<value-of select="count(atom:modified)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:issued)=1">
				&lt;<name path=".."/>/<name/>&gt; must have exactly one &lt;atom:issued&gt; child element. 
				<value-of select="count(atom:issued)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:created)&lt;2">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;atom:created&gt; child element. 
				<value-of select="count(atom:created)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:summary)&lt;2">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;atom:summary&gt; child element. 
				<value-of select="count(atom:summary)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="atom:title">
			<assert test="parent::atom:feed or parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; or &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="atom:link">
			<assert test="parent::atom:feed or parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; or &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="count(child::*)=0">
				&lt;<name path=".."/>/<name/>&gt; must not have any child elements.
			</assert>
			<assert test="@rel">
				&lt;<name path=".."/>/<name/>&gt; must have a rel attribute.
			</assert>
			<assert test="not(@rel) or @rel='alternate' or @rel='start' or @rel='next' or @rel='prev' or @rel='service.edit' or @rel='service.post' or @rel='service.feed'">
				&lt;<name path=".."/>/<name/>&gt; rel attribute must be alternate, start, next, prev, service.edit, service.post or service.feed.
			</assert>
			<assert test="not(@rel='alternate' and parent::*/atom:link[@rel='alternate' and @type=current()/@type and generate-id(.)!=generate-id(current())])">
				&lt;<name path=".."/>/<name/>&gt; with rel attribute of alternate must not have a sibling element rel attribute value of alternate and same type attribute value.
			</assert> 
			<assert test="@type">
				&lt;<name path=".."/>/<name/>&gt; must have a type attribute.
			</assert>
			<assert test="@href">
				&lt;<name path=".."/>/<name/>&gt; must have a href attribute.
			</assert>
			<assert test="not(@href) or string-length(@href)&gt;1">
				&lt;<name path=".."/>/<name/>&gt; href attribute must be a URI.
			 </assert>
			<assert test="string-length(.)=0">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
			<report test="@title and string-length(@title)=0">
				&lt;<name path=".."/>/<name/>&gt; title attribute should not be empty.
			</report>
		</rule>
		<rule context="atom:author">
			<assert test="parent::atom:feed or parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; or &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="count(atom:name)=1">
				&lt;<name path=".."/>/<name/>&gt; must have exactly one &lt;atom:name&gt; child element. 
				<value-of select="count(atom:name)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:url)&lt;2">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;atom:url&gt; child element. 
				<value-of select="count(atom:url)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:email)&lt;2">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;atom:email&gt; child element. 
				<value-of select="count(atom:email)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="atom:contributor">
			<assert test="parent::atom:feed or parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; or &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="count(atom:name)=1">
				&lt;<name path=".."/>/<name/>&gt; must have exactly one &lt;atom:name&gt; child element. 
				<value-of select="count(atom:name)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:url)&lt;2">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;atom:url&gt; child element. 
				<value-of select="count(atom:url)" /> occurance(s) found.
			</assert>
			<assert test="count(atom:email)&lt;2">
				&lt;<name path=".."/>/<name/>&gt; must have zero or one &lt;atom:email&gt; child element. 
				<value-of select="count(atom:email)" /> occurance(s) found.
			</assert>
		</rule>
		<rule context="atom:id">
			<assert test="parent::atom:feed or parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; or &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="not(//atom:id[.=current() and generate-id(.)!=generate-id(current())])">
				The value of &lt;<name path=".."/>/<name/>&gt; should be unique.
				Duplicate value <value-of select="text()" /> found.
			</assert> 
		</rule>
		<rule context="atom:feed/atom:modified">
			<assert test="substring(.,string-length(.),1)='Z'">
				&lt;<name path=".."/>/<name/>&gt; time must be UTC.
			</assert>
		</rule>
		<rule context="atom:modified">
			<assert test="parent::atom:feed or parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; or &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<report test="string-length(.)&gt;16 and substring(.,string-length(.),1)!='Z'">
				&lt;<name path=".."/>/<name/>&gt; time should be UTC.
			</report>
		</rule>
		<rule context="atom:issued">
			<assert test="parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="atom:created">
			<assert test="parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<report test="string-length(.)&gt;16 and substring(.,string-length(.),1)!='Z'">
				&lt;<name path=".."/>/<name/>&gt; time should be UTC.
			</report>
		</rule>
		<rule context="atom:summary">
			<assert test="parent::atom:entry or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:entry&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="atom:content">
			<assert test="parent::atom:entry or parent::atom:content or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:entry&gt; or &lt;atom:content&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="@type!='multipart/alternative' or not(@mode)">
				&lt;<name path=".."/>/<name/>&gt; must not have a mode attribute if the type attribute is multipart/alternative.
			</assert>
			<assert test="not(@type) or @type!='multipart/alternative' or count(atom:content)&gt;0">
				&lt;<name path=".."/>/<name/>&gt; must have at least one atom:content child element if the type attribute is multipart/alternative.
			</assert>
			<assert test="@type!='multipart/alternative' or not(parent::atom:content)">
				&lt;<name path=".."/>/<name/>&gt; must not have a atom:content parent element if the type attribute is multipart/alternative.
			</assert>
			<assert test="not(parent::atom:content) or parent::atom:content/@type='multipart/alternative'">
				if &lt;<name path=".."/>/<name/>&gt; has parent &lt;atom:content&gt;, then the parent must have type attribute of multipart/alternative.
			</assert>
			<assert test="not(parent::atom:content) or not(parent::atom:content/@mode)">
				if &lt;<name path=".."/>/<name/>&gt; has parent &lt;atom:content&gt;, then the parent must not have a mode attribute.
			</assert>
			<report test="parent::atom:content and parent::atom:content/atom:content[@mode=current()/@mode and @type=current()/@type and generate-id(.)!=generate-id(current())]">
				&lt;<name path=".."/>/<name/>&gt; has a duplicate representation under content/multipart.
			</report>
		</rule>
		<rule context="atom:tagline">
			<assert test="parent::atom:feed or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="atom:generator">
			<assert test="parent::atom:feed or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="atom:copyright">
			<assert test="parent::atom:feed or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="atom:info">
			<assert test="parent::atom:feed or namespace-uri(parent::*)!='http://purl.org/atom/ns#'">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:feed&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="atom:name">
			<assert test="parent::atom:author or parent::atom:contributor">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:author&gt; or &lt;atom:contributor&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<report test="string-length(.)=0">
				&lt;<name path=".."/>/<name/>&gt; should not be empty.
			</report>
		</rule>
		<rule context="atom:url">
			<assert test="parent::atom:author or parent::atom:contributor">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:author&gt; or &lt;atom:contributor&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
			<report test="not(starts-with(., 'http://') or starts-with(., 'https://') or starts-with(., 'ftp://'))">
				&lt;<name path=".."/>/<name/>&gt; should contain http, https, and ftp urls.
			</report>
		</rule>
		<rule context="atom:email">
			<assert test="parent::atom:author or parent::atom:contributor">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;atom:author&gt; or &lt;atom:contributor&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="atom:*">
			<assert test="false">
				&lt;<name path=".."/>/<name/>&gt; is not a valid atom element
			</assert>
		</rule>
	</pattern>
	<pattern name="dublin core terms namespace">
		<rule context="dcterms:alternative|dcterms:abstract|dcterms:tableOfContents|dcterms:valid|dcterms:available|
				dcterms:extent|dcterms:medium|dcterms:isVersionOf|dcterms:hasVersion|
				dcterms:isReplacedBy|dcterms:replaces|dcterms:isRequiredBy|dcterms:requires|dcterms:isPartOf|
				dcterms:hasPart|dcterms:isReferencedBy|dcterms:references|dcterms:isFormatOf|dcterms:hasFormat|
				dcterms:conformsTo|dcterms:spatial|dcterms:temporal|dcterms:audience|dcterms:mediator">
			<assert test="parent::rss:channel or parent::rss:item or parent::rss:image or parent::rss:textinput or parent::channel or parent::item">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:channel&gt; or &lt;rss:item&gt; or &lt;rss:image&gt; or &lt;rss:textinput&gt; or &lt;channel&gt; or &lt;item&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="dcterms:created|dcterms:issued|dcterms:modified|dcterms:dataAccepted|dcterms:dateSubmitted|dcterms:dateCopyrighted">
			<assert test="parent::rss:channel or parent::rss:item or parent::rss:image or parent::rss:textinput or parent::channel or parent::item">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;rss:channel&gt; or &lt;rss:item&gt; or &lt;rss:image&gt; or &lt;rss:textinput&gt; or &lt;channel&gt; or &lt;item&gt; parent element. 
				Parent is <value-of select="name(..)" />.
			</assert>
		</rule>
		<rule context="dcterms:*">
			<assert test="false">
				&lt;<name path=".."/>/<name/>&gt; is not a valid dublin core terms namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="RSS Link Module">
		<rule context="l:link">
			<assert test="@l:rel">
				&lt;<name path=".."/>/<name/>&gt; must have the rel attribute.
			</assert>
			<assert test="@rdf:resource">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
		</rule>
		<rule context="l:*">
			<assert test="false">
				&lt;<name path=".."/>/<name/>&gt; is not a link module namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="Easy News Topic namespace">
		<rule context="ent:cloud">
			<report test="not(parent::item)">
				&lt;<name path=".."/>/<name/>&gt; should have the &lt;item&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</report>
			<assert test="count(ent:topic)&gt;0">
				&lt;<name path=".."/>/<name/>&gt; must have at least one &lt;ent:topic&gt; child element.
				<value-of select="count(ent:topic)" /> occurance(s) found.
			</assert>
			<assert test="@href">
				&lt;<name path=".."/>/<name/>&gt; must have an href attribute.
			</assert>
		</rule>
		<rule context="ent:topic">
			<assert test="parent::ent:cloud">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;ent:cloud&gt; parent element.
				Parent is <value-of select="name(..)" />.
			</assert>
			<assert test="@id">
				&lt;<name path=".."/>/<name/>&gt; must have an id attribute.
			</assert>
		</rule>
		<rule context="ent:*">
			<assert test="false">
				&lt;<name path=".."/>/<name/>&gt; is not a valid Easy News Topic namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="FOAF namespace">
		<rule context="rdf:RDF">
			<report test="foaf:*" see="http://xmlns.com/foaf/0.1/">
				FOAF version 0.1. 
				The FOAF implementation in the Really Simple Validator is incomplete and untested.
			</report>
		</rule>
		<rule context="foaf:Agent">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:member or parent::foaf:maker" see="http://xmlns.com/foaf/0.1/#term_Agent">
				&lt;<name path=".."/>/<name/>&gt; must have the foaf:member or foaf:maker or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:Document">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:interest or parent::foaf:accountServiceHomepage or parent::foaf:publications or 
					parent::foaf:weblog or parent::foaf:homepage or parent::foaf:workplaceHomepage or 
					parent::foaf:tipjar or parent::foaf:workInfoHomepage or parent::foaf:schoolHomepage or 
					parent::foaf:page" see="http://xmlns.com/foaf/0.1/#term_Document">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:interest&gt; or &lt;foaf:accountServiceHomepage&gt; or &lt;foaf:publications&gt; or 
				&lt;foaf:weblog&gt; or &lt;foaf:homepage&gt; or &lt;foaf:workplaceHomepage&gt; or &lt;foaf:tipjar&gt; or &lt;foaf:workInfoHomepage&gt; or 
				&lt;foaf:schoolHomepage&gt; or &lt;foaf:page&gt; or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:Group">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/'" 
					see="http://xmlns.com/foaf/0.1/#term_Group">
				&lt;<name path=".."/>/<name/>&gt; must have a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:Image">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:img or parent::foaf:depiction or parent::foaf:thumbnail"
					see ="http://xmlns.com/foaf/0.1/#term_Image">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:img&gt; or &lt;foaf:depiction&gt; or &lt;foaf:thumbnail&gt; or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:OnlineAccount">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:holdsAccount" see="http://xmlns.com/foaf/0.1/#term_OnlineAccount">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:holdsAccount&gt; or &lt;foaf:thumbnail&gt; or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:OnlineChatAccount">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:holdsAccount" see="http://xmlns.com/foaf/0.1/#term_OnlineChatAccount">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:holdsAccount&gt; or &lt;foaf:thumbnail&gt; or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:OnlineEcommerceAccount">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:holdsAccount" see="http://xmlns.com/foaf/0.1/#term_OnlineEcommerceAccount">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:holdsAccount&gt; or &lt;foaf:thumbnail&gt; or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:OnlineGamingAccount">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:holdsAccount" see="http://xmlns.com/foaf/0.1/#term_OnlineGamingAccount">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:holdsAccount&gt; or &lt;foaf:thumbnail&gt; or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:Organization">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:member or parent::foaf:maker" see="http://xmlns.com/foaf/0.1/#term_Organization">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:member&gt; or &lt;foaf:maker&gt; or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:Person">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/' or 
					parent::foaf:member or parent::foaf:maker or parent::foaf:knows"
					see="http://xmlns.com/foaf/0.1/#term_Person">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:member&gt; or &lt;foaf:maker&gt; or &lt;foaf:knows&gt; or a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:PersonalProfileDocument">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/'"
					see="http://xmlns.com/foaf/0.1/#term_PersonalProfileDocument">
				&lt;<name path=".."/>/<name/>&gt; must have the a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:Project">
			<assert test="namespace-uri(parent::*)!='http://xmlns.com/foaf/0.1/'"
					see="http://xmlns.com/foaf/0.1/#term_Project">
				&lt;<name path=".."/>/<name/>&gt; must have the a non-foaf parent element.
			</assert>
		</rule>
		<rule context="foaf:accountName">
			<assert test="not(@*[name()!='xml:lang'])"
					see="http://xmlns.com/foaf/0.1/#term_accountName">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0"
					see="http://xmlns.com/foaf/0.1/#term_accountName">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0"
					see="http://xmlns.com/foaf/0.1/#term_accountName">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
			<assert test="parent::foaf:OnlineAccount or parent::foaf:OnlineChatAccount or 
					parent::foaf:OnlineEcommerceAccount or parent::foaf:OnlineGamingAccount"
					see="http://xmlns.com/foaf/0.1/#term_accountName">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:OnlineAccount&gt;, &lt;foaf:OnlineChatAccount&gt;, &lt;foaf:OnlineEcommerceAccount&gt; or &lt;foaf:OnlineGamingAccount&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:accountServiceHomepage">
			<assert test="parent::foaf:OnlineAccount or parent::foaf:OnlineChatAccount or 
					parent::foaf:OnlineEcommerceAccount or parent::foaf:OnlineGamingAccount"
					see="http://xmlns.com/foaf/0.1/#term_accountServiceHomepage">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:OnlineAccount&gt;, &lt;foaf:OnlineChatAccount&gt;, &lt;foaf:OnlineEcommerceAccount&gt; or &lt;foaf:OnlineGamingAccount&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:aimChatID">
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_aimChatID">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_aimChatID">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_aimChatID">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_aimChatID">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:based_near">
			<assert test="true">
				Nothing.
			</assert>
		</rule>
		<rule context="foaf:currentProject">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_currentProject">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_currentProject">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_currentProject">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_currentProject">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_currentProject">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:depiction">
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_depiction">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_depiction">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_depiction">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_depiction">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:depicts">
			<assert test="parent::foaf:Image" see="http://xmlns.com/foaf/0.1/#term_depicts">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Image&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_depicts">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_depicts">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_depicts">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:dnaChecksum">
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_dnaChecksum">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_dnaChecksum">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_dnaChecksum">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:family_name">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_family_name">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_family_name">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_family_name">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_family_name">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:firstName">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_firstName">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_firstName">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_firstName">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_firstName">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:fundedBy">
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_fundedBy">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_fundedBy">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_fundedBy">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:geekcode">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_geekCode">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_geekCode">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_geekCode">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_geekCode">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:gender">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_gender">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_gender">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_gender">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_gender">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
			<report test=".!='male' and .!='female'" see="http://xmlns.com/foaf/0.1/#term_gender">
				&lt;<name path=".."/>/<name/>&gt; should be male or female.
			</report>
		</rule>
		<rule context="foaf:givenname">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_givenname">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_givenname">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_givenname">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_givenname">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:holdsAccount">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_holdsAccount">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:homepage">
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_homepage">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_homepage">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_homepage">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_homepage">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:icqChatID">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_icqChatID">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_icqChatID">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_icqChatID">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_icqChatID">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:img">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_img">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:interest">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_interest">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:jabberID">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_jabberID">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_jabberID">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_jabberID">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_jabberID">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:knows">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_knows">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:logo">
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_logo">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_logo">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_logo">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_logo">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:made">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_made">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_made">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_made">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_made">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_made">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:maker">
			<report test="false">
				Nothing.
			</report>
		</rule>
		<rule context="foaf:mbox">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_mbox">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_mbox">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_mbox">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_mbox">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_mbox">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:mbox_sha1sum">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_mbox_sha1sum">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_mbox_sha1sum">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_mbox_sha1sum">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_mbox_sha1sum">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:member">
			<assert test="parent::foaf:Group" see="http://xmlns.com/foaf/0.1/#term_member">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Group&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:membershipClass">
			<assert test="parent::foaf:Group" see="http://xmlns.com/foaf/0.1/#term_membershipClass">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Group&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:msnChatID">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_msnChatID">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_msnChatID">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_msnChatID">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_msnChatID">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:myersBriggs">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_myersBriggs">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_myersBriggs">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_myersBriggs">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_myersBriggs">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
			<assert test=".='ESTJ' or .='INFP' or .='ESFP' or .='INTJ' or .='ESFJ' or .='INTP' or .='ENFP' or 
					.='ISTJ' or .='ESTP' or .='INFJ' or .='ENFJ' or .='ISTP' or .='ENTJ' or .='ISFP' or 
					.='ENTP' or .='ISFJ'" see="http://xmlns.com/foaf/0.1/#term_myersBriggs">
				&lt;<name path=".."/>/<name/>&gt; must be a valid Myers-Briggs class [EI][SN][TF][JP].
			</assert>
		</rule>
		<rule context="foaf:name">
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_name">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_name">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_name">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:nick">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_nick">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_nick">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_nick">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_nick">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:page">
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_page">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_page">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_page">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_page">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:pastProject">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_pastProject">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_pastProject">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_pastProject">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_pastProject">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_pastProject">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:phone">
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_phone">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_phone">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_phone">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_phone">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:plan">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_plan">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_plan">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_plan">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_plan">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:primaryTopic">
			<assert test="parent::foaf:Document" see="http://xmlns.com/foaf/0.1/#term_primaryTopic">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Document&gt; parent element.
			</assert>
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_primaryTopic">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_primaryTopic">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_primaryTopic">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_primaryTopic">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:publications">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_publications">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:schoolHomepage">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_schoolHomepage">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:sha1">
			<assert test="parent::foaf:Document" see="http://xmlns.com/foaf/0.1/#term_sha1">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Document&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_sha1">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_sha1">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_sha1">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:surname">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_surname">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_surname">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_surname">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_surname">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:theme">
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_theme">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_theme">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_theme">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_theme">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:thumbnail">
			<assert test="parent::foaf:Image" see="http://xmlns.com/foaf/0.1/#term_thumbnail">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Image&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:tipjar">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_tipjar">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:title">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_title">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_title">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_title">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_title">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:topic">
			<assert test="parent::foaf:Document" see="http://xmlns.com/foaf/0.1/#term_topic">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Document&gt; parent element.
			</assert>
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_topic">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_topic">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_topic">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_topic">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:topic_interest">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_topic_interest">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="@rdf:resource" see="http://xmlns.com/foaf/0.1/#term_topic_interest">
				&lt;<name path=".."/>/<name/>&gt; must have the rdf:resource attribute.
			</assert>
			<assert test="not(@*[name()!='rdf:resource'])" see="http://xmlns.com/foaf/0.1/#term_topic_interest">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than rdf:resource.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_topic_interest">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)=0" see="http://xmlns.com/foaf/0.1/#term_topic_interest">
				&lt;<name path=".."/>/<name/>&gt; must not have text content.
			</assert>
		</rule>
		<rule context="foaf:weblog">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_weblog">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:workInfoHomepage">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_workInfoHomepage">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:workplaceHomepage">
			<assert test="parent::foaf:Person" see="http://xmlns.com/foaf/0.1/#term_workplaceHomepage">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Person&gt; parent element.
			</assert>
		</rule>
		<rule context="foaf:yahooChatID">
			<assert test="parent::foaf:Agent or parent::foaf:Group or parent::foaf:Organization or parent::foaf:Person"
					see="http://xmlns.com/foaf/0.1/#term_yahooChatID">
				&lt;<name path=".."/>/<name/>&gt; must have the &lt;foaf:Agent&gt; or &lt;foaf:Group&gt; or &lt;foaf:Organization&gt; or &lt;foaf:Person&gt; parent element.
			</assert>
			<assert test="not(@*[name()!='xml:lang'])" see="http://xmlns.com/foaf/0.1/#term_yahooChatID">
				&lt;<name path=".."/>/<name/>&gt; must not have an attribute other than xml:lang.
			</assert>
			<assert test="count(child::*)=0" see="http://xmlns.com/foaf/0.1/#term_yahooChatID">
				&lt;<name path=".."/>/<name/>&gt; must not have child elements.
				Child <value-of select="name(child::*[position()=1])" /> found.
			</assert>
			<assert test="string-length(.)&gt;0" see="http://xmlns.com/foaf/0.1/#term_yahooChatID">
				&lt;<name path=".."/>/<name/>&gt; must have text content.
			</assert>
		</rule>
		<rule context="foaf:*" see="http://xmlns.com/foaf/0.1/">
			<assert test="false">
				&lt;<name path=".."/>/<name/>&gt; is not a valid FOAF namespace element.
			</assert>
		</rule>
	</pattern>
	<pattern name="unknown namespace">
		<rule context="*">
			<report test="namespace-uri()!='http://www.w3.org/1999/02/22-rdf-syntax-ns#' and
				namespace-uri()!='http://purl.org/rss/1.0/' and
				namespace-uri()!='http://purl.org/dc/elements/1.1/' and
				namespace-uri()!='http://webns.net/mvcb/' and
				namespace-uri()!='http://backend.userland.com/blogChannelModule' and
				namespace-uri()!='http://www.w3.org/2001/XMLSchema' and
				namespace-uri()!='http://purl.org/rss/1.0/modules/syndication/' and
				namespace-uri()!='http://purl.org/rss/1.0/modules/content/' and
				namespace-uri()!='http://www.w3.org/1999/xhtml' and
				namespace-uri()!='http://backend.userland.com/creativeCommonsRssModule' and
				namespace-uri()!='http://my.netscape.com/rdf/simple/0.9/' and
				namespace-uri()!='http://madskills.com/public/xml/rss/module/trackback/' and
				namespace-uri()!='http://wellformedweb.org/CommentAPI/' and
				namespace-uri()!='http://purl.org/rss/1.0/modules/slash/' and
				namespace-uri()!='http://purl.org/atom/ns#' and
				namespace-uri()!='http://purl.org/dc/terms/' and
				namespace-uri()!='http://www.purl.org/NET/ENT/1.0/' and
				namespace-uri()!='http://xmlns.com/foaf/0.1/' and
				namespace-uri()!='http://www.w3.org/2000/01/rdf-schema#' and
				string(namespace-uri()) ">
					&lt;<name path=".."/>/<name/>&gt; is not supported by this validator.
			</report>
		</rule>
	</pattern>
	<pattern name="dates">
		<rule context="atom:issued">
			<assert test="number(substring(.,1,4))&gt;0 and number(substring(.,1,4))&lt;10000 and
					(string-length(.)&lt;5 or 
						(substring(.,5,1)='-' and number(substring(.,6,2))&gt;0 and number(substring(.,6,2))&lt;13)) and
					(string-length(.)&lt;8 or 
						(substring(.,8,1)='-' and number(substring(.,9,2))&gt;0 and number(substring(.,9,2))&lt;32)) and
					(string-length(.)&lt;11 or 
						(substring(.,11,1)='T' and number(substring(.,12,2))&gt;-1 and number(substring(.,12,2))&lt;25 and
						substring(.,14,1)=':' and number(substring(.,15,2))&gt;-1 and number(substring(.,15,2))&lt;61)) and
					(string-length(.)&lt;11 or string-length(.)=16 or substring(.,17,1)=':' or substring(.,17,1)='+' or substring(.,17,1)='-' or substring(.,17,1)='Z') and
					(string-length(.)&lt;11 or string-length(.)=16 or string-length(.)&gt;17 or substring(.,17,1)='Z') and
					(string-length(.)&lt;11 or string-length(.)=16 or substring(.,17,1)=':' or substring(.,17,1)='Z' or ( (substring(.,17,1)='+' or substring(.,17,1)='-') and number(substring(.,18,2))&gt;-1 and number(substring(.,18,2))&lt;13)) and
					(string-length(.)&lt;11 or string-length(.)=16 or substring(.,17,1)=':' or substring(.,17,1)='Z' or ( (substring(.,17,1)='+' or substring(.,17,1)='-') and substring(.,20,1)=':')) and
					(string-length(.)&lt;11 or string-length(.)=16 or substring(.,17,1)=':' or substring(.,17,1)='Z' or ( (substring(.,17,1)='+' or substring(.,17,1)='-') and number(substring(.,21,2))&gt;-1 and number(substring(.,21,2))&lt;61)) and
					(string-length(.)&lt;11 or string-length(.)=16 or substring(.,17,1)=':' or substring(.,17,1)='Z' or string-length(.)=22) and
					(string-length(.)&lt;18 or string-length(.)=16 or substring(.,17,1)='+' or substring(.,17,1)='-' or (substring(.,17,1)=':' and number(substring(.,18,2))&gt;-1 and number(substring(.,18,2))&lt;61)) and
					(string-length(.)&lt;18 or string-length(.)=16 or substring(.,17,1)='+' or substring(.,17,1)='-' or string-length(.)=19 or substring(.,20,1)='.' or substring(.,20,1)='Z' or string-length(.)&gt;20) and
					(string-length(.)&lt;21 or string-length(.)=16 or substring(.,17,1)='+' or substring(.,17,1)='-' or string-length(.)=19 or substring(.,20,1)='.' or substring(.,20,1)='Z' or ( (substring(.,20,1)='+' or substring(.,20,1)='-') and number(substring(.,21,2))&gt;-1 and number(substring(.,21,2))&lt;13)) and
					(string-length(.)&lt;21 or string-length(.)=16 or substring(.,17,1)='+' or substring(.,17,1)='-' or string-length(.)=19 or substring(.,20,1)='.' or substring(.,20,1)='Z' or ( (substring(.,20,1)='+' or substring(.,20,1)='-') and substring(.,23,1)=':')) and
					(string-length(.)&lt;21 or string-length(.)=16 or substring(.,17,1)='+' or substring(.,17,1)='-' or string-length(.)=19 or substring(.,20,1)='.' or substring(.,20,1)='Z' or ( (substring(.,20,1)='+' or substring(.,20,1)='-') and number(substring(.,24,2))&gt;-1 and number(substring(.,24,2))&lt;61)) and
					(string-length(.)&lt;21 or string-length(.)=16 or substring(.,17,1)='+' or substring(.,17,1)='-' or string-length(.)=19 or substring(.,20,1)='.' or substring(.,20,1)='Z' or ( (substring(.,20,1)='+' or substring(.,20,1)='-') and string-length(.)=25))">
				&lt;<name path=".."/>/<name/>&gt; is not in ISO 8601 date format.
			</assert>
			<report test="string-length(.)&gt;20 and substring(.,20,1)='.'">
				No validation of ISO 8601 data format milliseconds or timezone when milliseconds are presents.
			</report>
			<assert test="not ((substring(.,6,2)='02' or substring(.,6,2)='04' or substring(.,6,2)='06' or substring(.,6,2)='09' or substring(.,6,2)='11') and substring(.,9,2)='31')">
				&lt;<name path=".."/>/<name/>&gt; is not a valid date (31st of the month).
			</assert>
			<assert test="not (substring(.,6,2)='02' and substring(.,9,2)='30')">
				&lt;<name path=".."/>/<name/>&gt; is not a valid date (February 30th).
			</assert>
		</rule>
		<rule context="atom:created|atom:modified|dc:date|sy:updateBase|dcterms:created|dcterms:issued|dcterms:modified|dcterms:dataAccepted|dcterms:dateSubmitted|dcterms:dateCopyrighted">
			<assert test="number(substring(.,1,4))&gt;0 and number(substring(.,1,4))&lt;10000 and
					(string-length(.)&lt;5 or 
						(substring(.,5,1)='-' and number(substring(.,6,2))&gt;0 and number(substring(.,6,2))&lt;13)) and
					(string-length(.)&lt;8 or 
						(substring(.,8,1)='-' and number(substring(.,9,2))&gt;0 and number(substring(.,9,2))&lt;32)) and
					(string-length(.)&lt;11 or 
						(substring(.,11,1)='T' and number(substring(.,12,2))&gt;-1 and number(substring(.,12,2))&lt;25 and
						substring(.,14,1)=':' and number(substring(.,15,2))&gt;-1 and number(substring(.,15,2))&lt;61)) and
					(string-length(.)&lt;11 or substring(.,17,1)=':' or substring(.,17,1)='+' or substring(.,17,1)='-' or substring(.,17,1)='Z') and
					(string-length(.)&lt;11 or string-length(.)&gt;17 or substring(.,17,1)='Z') and
					(string-length(.)&lt;11 or substring(.,17,1)=':' or substring(.,17,1)='Z' or ( (substring(.,17,1)='+' or substring(.,17,1)='-') and number(substring(.,18,2))&gt;-1 and number(substring(.,18,2))&lt;13)) and
					(string-length(.)&lt;11 or substring(.,17,1)=':' or substring(.,17,1)='Z' or ( (substring(.,17,1)='+' or substring(.,17,1)='-') and substring(.,20,1)=':')) and
					(string-length(.)&lt;11 or substring(.,17,1)=':' or substring(.,17,1)='Z' or ( (substring(.,17,1)='+' or substring(.,17,1)='-') and number(substring(.,21,2))&gt;-1 and number(substring(.,21,2))&lt;61)) and
					(string-length(.)&lt;11 or substring(.,17,1)=':' or substring(.,17,1)='Z' or string-length(.)=22) and
					(string-length(.)&lt;18 or substring(.,17,1)='+' or substring(.,17,1)='-' or (substring(.,17,1)=':' and number(substring(.,18,2))&gt;-1 and number(substring(.,18,2))&lt;61)) and
					(string-length(.)&lt;18 or substring(.,17,1)='+' or substring(.,17,1)='-' or substring(.,20,1)='.' or substring(.,20,1)='Z' or string-length(.)&gt;20) and
					(string-length(.)&lt;21 or substring(.,17,1)='+' or substring(.,17,1)='-' or substring(.,20,1)='.' or substring(.,20,1)='Z' or ( (substring(.,20,1)='+' or substring(.,20,1)='-') and number(substring(.,21,2))&gt;-1 and number(substring(.,21,2))&lt;13)) and
					(string-length(.)&lt;21 or substring(.,17,1)='+' or substring(.,17,1)='-' or substring(.,20,1)='.' or substring(.,20,1)='Z' or ( (substring(.,20,1)='+' or substring(.,20,1)='-') and substring(.,23,1)=':')) and
					(string-length(.)&lt;21 or substring(.,17,1)='+' or substring(.,17,1)='-' or substring(.,20,1)='.' or substring(.,20,1)='Z' or ( (substring(.,20,1)='+' or substring(.,20,1)='-') and number(substring(.,24,2))&gt;-1 and number(substring(.,24,2))&lt;61)) and
					(string-length(.)&lt;21 or substring(.,17,1)='+' or substring(.,17,1)='-' or substring(.,20,1)='.' or substring(.,20,1)='Z' or ( (substring(.,20,1)='+' or substring(.,20,1)='-') and string-length(.)=25))">
				&lt;<name path=".."/>/<name/>&gt; is not in ISO 8601 date format.
			</assert>
			<report test="string-length(.)&gt;20 and substring(.,20,1)='.'">
				No validation of ISO 8601 data format milliseconds or timezone when milliseconds are presents.
			</report>
			<assert test="not ((substring(.,6,2)='02' or substring(.,6,2)='04' or substring(.,6,2)='06' or substring(.,6,2)='09' or substring(.,6,2)='11') and substring(.,9,2)='31')">
				&lt;<name path=".."/>/<name/>&gt; is not a valid date (31st of the month).
			</assert>
			<assert test="not (substring(.,6,2)='02' and substring(.,9,2)='30')">
				&lt;<name path=".."/>/<name/>&gt; is not a valid date (February 30th).
			</assert>
		</rule>
		<rule context="pubDate|lastBuildDate|dateCreated|dateModified">
			<assert test="(substring(.,4,1)!=',' or 
						((substring(.,1,5)='Mon, ' or substring(.,1,5)='Tue, ' or substring(.,1,5)='Wed, ' or substring(.,1,5)='Thu, ' or substring(.,1,5)='Fri, ' or substring(.,1,5)='Sat, ' or substring(.,1,5)='Sun, ') and
						(substring(.,7,1)!=' ' or number(substring(.,6,1))&gt;0) and
						(substring(.,7,1)=' ' or (number(substring(.,6,2))&gt;0 and number(substring(.,6,2))&lt;32)) and
						(substring(.,7,1)=' ' or substring(.,8,5)=' Jan ' or substring(.,8,5)=' Feb ' or substring(.,8,5)=' Mar ' or substring(.,8,5)=' Apr ' or substring(.,8,5)=' May ' or substring(.,8,5)=' Jun ' or substring(.,8,5)=' Jul ' or substring(.,8,5)=' Aug ' or substring(.,8,5)=' Sep ' or substring(.,8,5)=' Oct ' or substring(.,8,5)=' Nov ' or substring(.,8,5)=' Dec ') and
						(substring(.,7,1)!=' ' or substring(.,7,5)=' Jan ' or substring(.,7,5)=' Feb ' or substring(.,7,5)=' Mar ' or substring(.,7,5)=' Apr ' or substring(.,7,5)=' May ' or substring(.,7,5)=' Jun ' or substring(.,7,5)=' Jul ' or substring(.,7,5)=' Aug ' or substring(.,7,5)=' Sep ' or substring(.,7,5)=' Oct ' or substring(.,7,5)=' Nov ' or substring(.,7,5)=' Dec ') and
						(substring(.,7,1)=' ' or (number(substring(.,13,4))&gt;0 and number(substring(.,13,4))&lt;10000)) and
						(substring(.,7,1)!=' ' or (number(substring(.,12,4))&gt;0 and number(substring(.,12,4))&lt;10000)) and
						(substring(.,7,1)=' ' or substring(.,17,1)=' ') and
						(substring(.,7,1)!=' ' or substring(.,16,1)=' ') and
						(substring(.,7,1)=' ' or (number(substring(.,18,2))&gt;-1 and number(substring(.,18,2))&lt;24)) and
						(substring(.,7,1)!=' ' or (number(substring(.,17,2))&gt;-1 and number(substring(.,17,2))&lt;24)) and
						(substring(.,7,1)=' ' or substring(.,20,1)=':') and
						(substring(.,7,1)!=' ' or substring(.,19,1)=':') and
						(substring(.,7,1)=' ' or (number(substring(.,21,2))&gt;-1 and number(substring(.,21,2))&lt;60)) and
						(substring(.,7,1)!=' ' or (number(substring(.,20,2))&gt;-1 and number(substring(.,20,2))&lt;60)) and
						(substring(.,7,1)=' ' or substring(.,23,1)=' ' or (number(substring(.,24,2))&gt;-1 and number(substring(.,24,2))&lt;60)) and
						(substring(.,7,1)!=' ' or substring(.,22,1)=' ' or (number(substring(.,23,2))&gt;-1 and number(substring(.,23,2))&lt;60)) and
						(substring(.,7,1)=' ' or substring(.,23,1)=' ' or (substring(.,26,2)&gt;=' A' and substring(.,26,2)&lt;=' Z' and string-length(.)=27) or (substring(.,26,3)=' UT' and string-length(.)=28) or string-length(.)=29 or string-length(.)=31) and
						(substring(.,7,1)=' ' or substring(.,23,1)=':' or (substring(.,23,2)&gt;=' A' and substring(.,23,2)&lt;=' Z' and string-length(.)=24) or (substring(.,23,3)=' UT' and string-length(.)=25) or string-length(.)=26 or string-length(.)=28) and
						(substring(.,7,1)!=' ' or substring(.,22,1)=' ' or (substring(.,25,2)&gt;=' A' and substring(.,25,2)&lt;=' Z' and string-length(.)=26) or (substring(.,25,3)=' UT' and string-length(.)=27) or string-length(.)=28 or string-length(.)=30) and
						(substring(.,7,1)!=' ' or substring(.,22,1)=':' or (substring(.,22,2)&gt;=' A' and substring(.,22,2)&lt;=' Z' and string-length(.)=23) or (substring(.,22,3)=' UT' and string-length(.)=24) or string-length(.)=25 or string-length(.)=27) and
						(substring(.,7,1)=' ' or substring(.,23,1)=' ' or string-length(.)!=29 or substring(.,26,4)=' GMT' or substring(.,26,4)=' EST' or substring(.,26,4)=' EDT' or substring(.,26,4)=' CST' or substring(.,26,4)=' CDT' or substring(.,26,4)=' MST' or substring(.,26,4)=' MDT' or substring(.,26,4)=' PST' or substring(.,26,4)=' PDT') and
						(substring(.,7,1)=' ' or substring(.,23,1)=':' or string-length(.)!=26 or substring(.,23,4)=' GMT' or substring(.,23,4)=' EST' or substring(.,23,4)=' EDT' or substring(.,23,4)=' CST' or substring(.,23,4)=' CDT' or substring(.,23,4)=' MST' or substring(.,23,4)=' MDT' or substring(.,23,4)=' PST' or substring(.,23,4)=' PDT') and
						(substring(.,7,1)!=' ' or substring(.,22,1)=' ' or string-length(.)!=28 or substring(.,25,4)=' GMT' or substring(.,25,4)=' EST' or substring(.,25,4)=' EDT' or substring(.,25,4)=' CST' or substring(.,25,4)=' CDT' or substring(.,25,4)=' MST' or substring(.,25,4)=' MDT' or substring(.,25,4)=' PST' or substring(.,25,4)=' PDT') and
						(substring(.,7,1)!=' ' or substring(.,22,1)=':' or string-length(.)!=25 or substring(.,22,4)=' GMT' or substring(.,22,4)=' EST' or substring(.,22,4)=' EDT' or substring(.,22,4)=' CST' or substring(.,22,4)=' CDT' or substring(.,22,4)=' MST' or substring(.,22,4)=' MDT' or substring(.,22,4)=' PST' or substring(.,22,4)=' PDT') and
						(substring(.,7,1)=' ' or substring(.,23,1)=' ' or string-length(.)!=31 or ((substring(.,27,1)='+' or substring(.,27,1)='-') and substring(.,28,4)&gt;-1)) and
						(substring(.,7,1)=' ' or substring(.,23,1)=':' or string-length(.)!=28 or ((substring(.,24,1)='+' or substring(.,24,1)='-') and substring(.,25,4)&gt;-1)) and
						(substring(.,7,1)!=' ' or substring(.,22,1)=' ' or string-length(.)!=30 or ((substring(.,26,1)='+' or substring(.,26,1)='-') and substring(.,27,4)&gt;-1)) and
						(substring(.,7,1)!=' ' or substring(.,22,1)=':' or string-length(.)!=27 or ((substring(.,23,1)='+' or substring(.,23,1)='-') and substring(.,24,4)&gt;-1)))) and
					(substring(.,4,1)=',' or 
						((substring(.,2,1)!=' ' or number(substring(.,1,1))&gt;0) and
						(substring(.,2,1)=' ' or (number(substring(.,1,2))&gt;0 and number(substring(.,1,2))&lt;32)) and
						(substring(.,2,1)=' ' or substring(.,3,5)=' Jan ' or substring(.,3,5)=' Feb ' or substring(.,3,5)=' Mar ' or substring(.,3,5)=' Apr ' or substring(.,3,5)=' May ' or substring(.,3,5)=' Jun ' or substring(.,3,5)=' Jul ' or substring(.,3,5)=' Aug ' or substring(.,3,5)=' Sep ' or substring(.,3,5)=' Oct ' or substring(.,3,5)=' Nov ' or substring(.,3,5)=' Dec ') and
						(substring(.,2,1)!=' ' or substring(.,2,5)=' Jan ' or substring(.,2,5)=' Feb ' or substring(.,2,5)=' Mar ' or substring(.,2,5)=' Apr ' or substring(.,2,5)=' May ' or substring(.,2,5)=' Jun ' or substring(.,2,5)=' Jul ' or substring(.,2,5)=' Aug ' or substring(.,2,5)=' Sep ' or substring(.,2,5)=' Oct ' or substring(.,2,5)=' Nov ' or substring(.,2,5)=' Dec ') and
						(substring(.,2,1)=' ' or (number(substring(.,8,4))&gt;0 and number(substring(.,8,4))&lt;10000)) and
						(substring(.,2,1)!=' ' or (number(substring(.,7,4))&gt;0 and number(substring(.,7,4))&lt;10000)) and
						(substring(.,2,1)=' ' or substring(.,12,1)=' ') and
						(substring(.,2,1)!=' ' or substring(.,11,1)=' ') and
						(substring(.,2,1)=' ' or (number(substring(.,13,2))&gt;-1 and number(substring(.,13,2))&lt;24)) and
						(substring(.,2,1)!=' ' or (number(substring(.,12,2))&gt;-1 and number(substring(.,12,2))&lt;24)) and
						(substring(.,2,1)=' ' or substring(.,15,1)=':') and
						(substring(.,2,1)!=' ' or substring(.,14,1)=':') and
						(substring(.,2,1)=' ' or (number(substring(.,16,2))&gt;-1 and number(substring(.,16,2))&lt;60)) and
						(substring(.,2,1)!=' ' or (number(substring(.,15,2))&gt;-1 and number(substring(.,15,2))&lt;60)) and
						(substring(.,2,1)=' ' or substring(.,18,1)=' ' or (number(substring(.,19,2))&gt;-1 and number(substring(.,19,2))&lt;60)) and
						(substring(.,2,1)!=' ' or substring(.,17,1)=' ' or (number(substring(.,18,2))&gt;-1 and number(substring(.,18,2))&lt;60)) and
						(substring(.,2,1)=' ' or substring(.,18,1)=' ' or (substring(.,21,1)=' ' and string-length(.)=22) or (substring(.,21,3)=' UT' and string-length(.)=23) or string-length(.)=24 or string-length(.)=26) and
						(substring(.,2,1)=' ' or substring(.,18,1)=':' or (substring(.,18,1)=' ' and string-length(.)=19) or (substring(.,18,3)=' UT' and string-length(.)=20) or string-length(.)=21 or string-length(.)=23) and
						(substring(.,2,1)!=' ' or substring(.,17,1)=' ' or (substring(.,20,1)=' ' and string-length(.)=21) or (substring(.,20,3)=' UT' and string-length(.)=22) or string-length(.)=23 or string-length(.)=25) and
						(substring(.,2,1)!=' ' or substring(.,17,1)=':' or (substring(.,17,1)=' ' and string-length(.)=18) or (substring(.,17,3)=' UT' and string-length(.)=19) or string-length(.)=20 or string-length(.)=22) and
						(substring(.,2,1)=' ' or substring(.,18,1)=' ' or string-length(.)!=24 or substring(.,21,4)=' GMT' or substring(.,21,4)=' EST' or substring(.,21,4)=' EDT' or substring(.,21,4)=' CST' or substring(.,21,4)=' CDT' or substring(.,21,4)=' MST' or substring(.,21,4)=' MDT' or substring(.,21,4)=' PST' or substring(.,21,4)=' PDT') and
						(substring(.,2,1)=' ' or substring(.,18,1)=':' or string-length(.)!=21 or substring(.,18,4)=' GMT' or substring(.,18,4)=' EST' or substring(.,18,4)=' EDT' or substring(.,18,4)=' CST' or substring(.,18,4)=' CDT' or substring(.,18,4)=' MST' or substring(.,18,4)=' MDT' or substring(.,18,4)=' PST' or substring(.,18,4)=' PDT') and
						(substring(.,2,1)!=' ' or substring(.,17,1)=' ' or string-length(.)!=23 or substring(.,20,4)=' GMT' or substring(.,20,4)=' EST' or substring(.,20,4)=' EDT' or substring(.,20,4)=' CST' or substring(.,20,4)=' CDT' or substring(.,20,4)=' MST' or substring(.,20,4)=' MDT' or substring(.,20,4)=' PST' or substring(.,20,4)=' PDT') and
						(substring(.,2,1)!=' ' or substring(.,17,1)=':' or string-length(.)!=20 or substring(.,17,4)=' GMT' or substring(.,17,4)=' EST' or substring(.,17,4)=' EDT' or substring(.,17,4)=' CST' or substring(.,17,4)=' CDT' or substring(.,17,4)=' MST' or substring(.,17,4)=' MDT' or substring(.,17,4)=' PST' or substring(.,17,4)=' PDT') and
						(substring(.,2,1)=' ' or substring(.,18,1)=' ' or string-length(.)!=26 or ((substring(.,22,1)='+' or substring(.,22,1)='-') and substring(.,23,4)&gt;-1)) and
						(substring(.,2,1)=' ' or substring(.,18,1)=':' or string-length(.)!=23 or ((substring(.,19,1)='+' or substring(.,19,1)='-') and substring(.,20,4)&gt;-1)) and
						(substring(.,2,1)!=' ' or substring(.,17,1)=' ' or string-length(.)!=25 or ((substring(.,21,1)='+' or substring(.,21,1)='-') and substring(.,22,4)&gt;-1)) and
						(substring(.,2,1)!=' ' or substring(.,17,1)=':' or string-length(.)!=22 or ((substring(.,18,1)='+' or substring(.,18,1)='-') and substring(.,19,4)&gt;-1))))">
				&lt;<name path=".."/>/<name/>&gt; is not in RFC 822 date format.
			</assert>
		</rule>
	</pattern>
	<pattern name="atom constructs">
		<rule context="atom:content|atom:title|atom:summary|atom:tagline|atom:copyright|atom:info">
			<report test="@mode='escaped' and @type='text/html' and (contains(translate(.,'EMBD','embd'),'&lt;embed ') or contains(translate(.,'EMBD','embd'),'&lt;embed&gt;'))">
				&lt;<name path=".."/>/<name/>&gt; should not contain an entity-encoded HTML &lt;embed&gt; element.
			</report>
			<report test="@mode='escaped' and @type='text/html' and (contains(translate(.,'META','meta'),'&lt;meta ') or contains(translate(.,'META','meta'),'&lt;meta&gt;'))">
				&lt;<name path=".."/>/<name/>&gt; should not contain an entity-encoded HTML &lt;meta&gt; element.
			</report>
			<report test="@mode='escaped' and @type='text/html' and (contains(translate(.,'OBJECT','object'),'&lt;object ') or contains(translate(.,'OBJECT','object'),'&lt;object&gt;'))">
				&lt;<name path=".."/>/<name/>&gt; should not contain an entity-encoded HTML &lt;object&gt; element.
			</report>
			<report test="@mode='escaped' and @type='text/html' and (contains(translate(.,'SCRIPT','script'),'&lt;script ') or contains(translate(.,'SCRIPT','script'),'&lt;script&gt;'))">
				&lt;<name path=".."/>/<name/>&gt; should not contain an entity-encoded HTML &lt;script&gt; element.
			</report>
			<assert test="not(@mode) or @mode='xml' or @mode='escaped' or @mode='base64'">
				&lt;<name path=".."/>/<name/>&gt; mode attribute must be xml, escaped or base64.
			</assert>
			<assert test="not(@mode) or @mode='xml' or count(child::*)=0">
				&lt;<name path=".."/>/<name/>&gt; may not have child elements if mode attribute is not xml.
			</assert>
			<assert test="(@type and @type!='text/html' and @type!='text/plain') or count(child::*)=0">
				&lt;<name path=".."/>/<name/>&gt; may not have child elements if type attribute is 'text/html' or 'text/plain'.
			</assert>
			<report test="(not(@mode) or @mode='xml') and @type='text/html'">
				&lt;<name path=".."/>/<name/>&gt; should not have mode attribute of xml and type attribute of text/html.
				Use mode attribute of escaped.
			</report>
			<report test="@mode='base64' and @type='text/html'">
				&lt;<name path=".."/>/<name/>&gt; should not have mode attribute of base64 and type attribute of text/html.
				Use mode attribute of escaped.
			</report>
			<report test="@mode='base64' and (not(@type) or @type='text/plain')">
				&lt;<name path=".."/>/<name/>&gt; should not have mode attribute of base64 and type attribute of text/html.
				Use mode attribute of escaped.
			</report>
			<assert test="not(@type) or starts-with(@type,'text/') or starts-with(@type,'image/') or starts-with(@type,'audio/') or starts-with(@type,'video/') or starts-with(@type,'application/') or starts-with(@type,'multipart/') or starts-with(@type,'message/')">
				&lt;<name path=".."/>/<name/>&gt; type attribute must be a valid media type.
			</assert>
		</rule>
	</pattern>
	<pattern name="cloud pattern">
		<rule context="cloud">
			<report test="string(normalize-space(text()))">
				&lt;<name/>&gt; should not have mixed text content.
			</report>
			<assert test="@domain" see="http://blogs.law.harvard.edu/tech/soapMeetsRss#aNewFeatureForRss">
				&lt;<name/>&gt; must have a domain attribute. 
			</assert>
			<assert test="@port" see="http://blogs.law.harvard.edu/tech/soapMeetsRss#aNewFeatureForRss">
				&lt;<name/>&gt; must have a port attribute. 
			</assert>
			<assert test="@path" see="http://blogs.law.harvard.edu/tech/soapMeetsRss#aNewFeatureForRss">
				&lt;<name/>&gt; must have a path attribute. 
			</assert>
			<assert test="@registerProcedure" see="http://blogs.law.harvard.edu/tech/soapMeetsRss#aNewFeatureForRss">
				&lt;<name/>&gt; must have a registerProcedure attribute. 
			</assert>
			<assert test="@protocol" see="http://blogs.law.harvard.edu/tech/soapMeetsRss#aNewFeatureForRss">
				&lt;<name/>&gt; must have a protocol attribute. 
			</assert>
			<assert test="not(@port) or (number(@port)&gt;0 and not(contains(@port,'.')))" see="http://blogs.law.harvard.edu/tech/soapMeetsRss#aNewFeatureForRss">
				&lt;<name/>&gt; port attribute must be a positive integer.
			</assert>
			<assert test="not(@protocol) or (@protocol='xml-rpc' or @protocol='soap' or @protocol='http-post')" see="http://blogs.law.harvard.edu/tech/soapMeetsRss#aNewFeatureForRss">
				&lt;<name/>&gt; protocol attribute must be xml-rpc, soap or http-post.
			</assert>
		</rule>
	</pattern>
	<pattern name="general patterns">
		<rule context="webMaster|managingEditor|author">
			<assert test="(not(contains(.,' ')) or (substring(substring-after(.,' '),1,1)='(' and substring(.,string-length(.),1)=')')) and
				(not(contains(.,' ')) or (contains(substring-before(.,' '),'@') and contains(substring-after(substring-before(.,' '),'@'),'.'))) and
				contains(.,'@') and contains(substring-after(.,'@'),'.')">
				&lt;<name path=".."/>/<name/>&gt; must be an email address. 
			</assert>
		</rule>
		<rule context="atom:email">
			<assert test="(not(contains(.,'&lt;')) or (substring(.,string-length(.),1)='&gt;' and contains(substring-after(.,'&gt;'),'@'))) and
				(not(contains(.,'&lt;')) or (contains(substring-after(.,'&lt;'),'@') and contains(substring-after(substring-after(.,'&lt;'),'@'),'.'))) and
				(not(contains(.,'&lt;')) or not(contains(substring-after(.,'&lt;'),' '))) and
				(contains(.,'&lt;') or not(contains(.,' '))) and
				contains(.,'@') and contains(substring-after(.,'@'),'.')">
				&lt;<name path=".."/>/<name/>&gt; must be an RFC 2822 email address. 
			</assert>
		</rule>
	</pattern>
	<pattern name="URI/URL/URNs">
		<rule context="atom:url|atom:id|rss:url|rss:link|link|url|comments|blogChannel:*">
			<assert test="contains(.,':') and
				not(contains(substring-before(translate(.,'`~!@#$%^&amp;*()_={}[]\|;&lt;,&gt;?/&quot; ','????????????????????????????'),':'),'?'))">
				&lt;<name path=".."/>/<name/>&gt; must be a URI.
			</assert>
		</rule>
		<rule context="guid">
			<assert test="@isPermaLink='false' or (contains(.,':') and
				not(contains(substring-before(translate(.,'`~!@#$%^&amp;*()_={}[]\|;&lt;,&gt;?/&quot; ','????????????????????????????'),':'),'?')))">
				&lt;<name path=".."/>/<name/>&gt; must be a URL, if isPermaLink is not false.
			</assert>
		</rule>
		<rule context="newLocation">
			<assert test="string-length(.)=0 or (contains(.,':') and
				not(contains(substring-before(translate(.,'`~!@#$%^&amp;*()_={}[]\|;&lt;,&gt;?/&quot; ','????????????????????????????'),':'),'?')))">
				&lt;<name path=".."/>/<name/>&gt; must be a URL or empty.
			</assert>
		</rule>
		<rule context="atom:generator|enclosure|source">
			<assert test="not(@url) or (contains(@url,':') and
				not(contains(substring-before(translate(@url,'`~!@#$%^&amp;*()_={}[]\|;&lt;,&gt;?/&quot; ','????????????????????????????'),':'),'?')))">
				&lt;<name path=".."/>/<name/>&gt; url attribute must be a URL.
			</assert>
		</rule>
		<rule context="atom:link">
			<assert test="not(@href) or (contains(@href,':') and
				not(contains(substring-before(translate(@href,'`~!@#$%^&amp;*()_={}[]\|;&lt;,&gt;?/&quot; ','????????????????????????????'),':'),'?')))">
				&lt;<name path=".."/>/<name/>&gt; href attribute must be a URL.
			</assert>
		</rule>
		<rule context="l:link">
			<assert test="not(@rdf:resource) or (contains(@rdf:resource,':') and
				not(contains(substring-before(translate(@rdf:resource,'`~!@#$%^&amp;*()_={}[]\|;&lt;,&gt;?/&quot; ','????????????????????????????'),':'),'?')))">
				&lt;<name path=".."/>/<name/>&gt; rdf:resource attribute must be a URL.
			</assert>
		</rule>
	</pattern>
	<pattern name="media types">
		<rule context="enclosure|atom:link">
			<assert test="not(@type) or starts-with(@type,'text/') or starts-with(@type,'image/') or 
					starts-with(@type,'audio/') or starts-with(@type,'video/') or 
					starts-with(@type,'application/') or starts-with(@type,'multipart/') or 
					starts-with(@type,'message/') or starts-with(@type,'model/')">
				&lt;<name path=".."/>/<name/>&gt; type attribute must be a valid media type.
			</assert>
		</rule>	
		<rule context="l:link">
			<report test="@type and not(starts-with(@type,'text/') or starts-with(@type,'image/') or 
					starts-with(@type,'audio/') or starts-with(@type,'video/') or 
					starts-with(@type,'application/') or starts-with(@type,'multipart/') or 
					starts-with(@type,'message/') or starts-with(@type,'model/'))">
				&lt;<name path=".."/>/<name/>&gt; type attribute should be a valid media type.
			</report>
		</rule>	
	</pattern>
	</schema>

