<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>porges &#187; XML</title>
	<atom:link href="http://porg.es/blog/tag/xml/feed" rel="self" type="application/rss+xml" />
	<link>http://porg.es/blog</link>
	<description></description>
	<lastBuildDate>Thu, 12 Jan 2012 23:45:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>So, it turns out that .NET&#8217;s Regex are more powerful t̖̱̍ͭ͊h̟ͨͨa̞̖̙̔̇n͇̝͚̤̒́ͨ̐ ̯͖̏̌̔Ị̟̮̱̥̇̐̎͂ͬ͗̒ ̪̹̱͙̘ͦ̉ͪͪͣ̉͊o͕̥̝͇͙ͪ͊ͤ̑̂̽́r͔̭̪̮̟͗̍ͨ͗͛ͣḭ̝̜͈ͫ́g̥̹̥̜̦̓̇̓i̪͕̭̞͛ͯ̓͛̔̾ͫn̘̗a̰̜ͨͪ͊l̩͑̐̐́ͥ̚l̜ͨ͋̈ẙͦ́ ̟̬̬̫͙̤ͭ̚t̳͎̱̗̲́h͔͙̰̬̊̈́͊̾o͉ͫ̌̄u͉̲̥g̏ͥ̑̅̽̇h̻͇̥̰̯ͥͯṱ̯̏̄̒͒ͫ̃.͖̟͍̘̼̼̍̐̀͊̓́&#8230;</title>
		<link>http://porg.es/blog/so-it-turns-out-that-dot-nets-regex-are-more-powerful-than-i-originally-thought</link>
		<comments>http://porg.es/blog/so-it-turns-out-that-dot-nets-regex-are-more-powerful-than-i-originally-thought#comments</comments>
		<pubDate>Mon, 09 May 2011 14:09:19 +0000</pubDate>
		<dc:creator>Porges</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[horrid]]></category>
		<category><![CDATA[regex]]></category>
		<category><![CDATA[silly]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://porg.es/blog/?p=575</guid>
		<description><![CDATA[Today, thanks to user Lucero on StackOverflow, I learned about .NET&#8217;s &#8220;Balancing Groups&#8221; Regex feature. Basically, any time you use a named capturing group, it actually pushes the capture onto a named stack. You can then pop this stack by using the same capturing group prefixed with a hyphen, like (?). Of course, anyone who [...]]]></description>
			<content:encoded><![CDATA[<p>Today, thanks to user <a href="http://stackoverflow.com/users/88558/lucero">Lucero</a> on StackOverflow, I learned about .NET&#8217;s &#8220;Balancing Groups&#8221; Regex feature.</p>
<p>Basically, any time you use a named capturing group, it actually pushes the capture onto a named stack. You can then pop this stack by using the same capturing group prefixed with a hyphen, like <code>(?<-stackToPop>)</code>.</p>
<hr/>
<p>Of course, anyone who finds themselves in this situation is going to ask: <em>can it match XML?</em></p>
<p><span id="more-575"></span></p>
<p>It&#8217;s possible that I am missing something completely (it is rather late at night), but &#8230; <em>very nearly</em>. I haven&#8217;t quite figured out a nested section in the local DTD subset, but no one uses that feature anyway. (Can you spot it?)</p>
<p>Aside from that, most of the well-formedness criteria are handled (the obvious one being element nesting). Things that require non-local information such as entities aren&#8217;t handled. I think it is possible to handle duplicate attribute names in this form as well (via a lookahead for duplicate names).</p>
<p>Here is the code, and a test file which shows some stuff that is caught by this. Breaking any of the elements should make it fail:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">var surrogate <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;([\ud800-\udbff][\udc00-\udfff])&quot;</span><span style="color: #008000;">;</span><span style="color: #008080; font-style: italic;">// .NET can't handle \U10000-\u10FFFF</span>
var c <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;([\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|&quot;</span><span style="color: #008000;">+</span>surrogate <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span> 
var s <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;([\u0020\u0009\u000d\u000a]+)&quot;</span><span style="color: #008000;">;</span>
var nameStartChar <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|&quot;</span> <span style="color: #008000;">+</span> surrogate <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var nameChar <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(&quot;</span> <span style="color: #008000;">+</span> nameStartChar <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])&quot;</span><span style="color: #008000;">;</span>
var name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'name'&quot;</span> <span style="color: #008000;">+</span> nameStartChar <span style="color: #008000;">+</span> nameChar <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;*)&quot;</span><span style="color: #008000;">;</span>
var names <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'names'&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;(\u0020&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span><span style="color: #666666;">&quot;)*)&quot;</span><span style="color: #008000;">;</span>
var nmtoken <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'nmtoken'&quot;</span> <span style="color: #008000;">+</span> nameChar <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;+)&quot;</span><span style="color: #008000;">;</span>
var nmtokens <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'nmtokens'&quot;</span> <span style="color: #008000;">+</span> nmtoken <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;(\u0020&quot;</span> <span style="color: #008000;">+</span> nmtoken <span style="color: #008000;">+</span><span style="color: #666666;">&quot;)*)&quot;</span><span style="color: #008000;">;</span>
var pereference <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;%&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;;&quot;</span><span style="color: #008000;">;</span>
var entityReference<span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'entityRef'&amp;&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;;)&quot;</span><span style="color: #008000;">;</span>
var charref <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;&amp;\#([0-9]+|x[0-9a-fA-F]+);&quot;</span><span style="color: #008000;">;</span>
var reference <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'reference'&quot;</span><span style="color: #008000;">+</span> entityReference <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> charref <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var entityValue <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'entityValue'<span style="color: #008080; font-weight: bold;">\&quot;</span>([^%&amp;<span style="color: #008080; font-weight: bold;">\&quot;</span>]|&quot;</span> <span style="color: #008000;">+</span> pereference <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> reference <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*<span style="color: #008080; font-weight: bold;">\&quot;</span>|'([^%&amp;']|&quot;</span> <span style="color: #008000;">+</span> pereference <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> reference <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*')&quot;</span><span style="color: #008000;">;</span>
var eq <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'eq'&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?=&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?)&quot;</span><span style="color: #008000;">;</span>
var versionNum  <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;1\.[0-9]+&quot;</span><span style="color: #008000;">;</span>
var comment <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'comment'&lt;!--((?!--)&quot;</span> <span style="color: #008000;">+</span> c <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*--&gt;)&quot;</span><span style="color: #008000;">;</span>
var PITarget <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'pitarget'(?![xX][mM][lL])&quot;</span><span style="color: #008000;">+</span>name<span style="color: #008000;">+</span><span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var PI<span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'PI'&lt;\?&quot;</span> <span style="color: #008000;">+</span> PITarget <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;((?!\?&gt;)&quot;</span> <span style="color: #008000;">+</span> c <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;)*)?\?&gt;)&quot;</span><span style="color: #008000;">;</span>
var misc <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'misc'&quot;</span> <span style="color: #008000;">+</span> comment <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> PI <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var versionInfo <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'versionInfo'&quot;</span><span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;version&quot;</span> <span style="color: #008000;">+</span> eq <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;('&quot;</span> <span style="color: #008000;">+</span> versionNum <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;'|<span style="color: #008080; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #008000;">+</span> versionNum <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\&quot;</span>))&quot;</span><span style="color: #008000;">;</span>
var encName <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'encName'[A-Za-z][A-Za-z0-9._-]*)&quot;</span><span style="color: #008000;">;</span>
var encodingDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'encodingDecl'&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;encoding&quot;</span> <span style="color: #008000;">+</span> eq <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;(<span style="color: #008080; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #008000;">+</span> encName <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\&quot;</span>|'&quot;</span><span style="color: #008000;">+</span> encName <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;'))&quot;</span><span style="color: #008000;">;</span>
var sddecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'sddecl'&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;standalone&quot;</span> <span style="color: #008000;">+</span> eq <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;(<span style="color: #008080; font-weight: bold;">\&quot;</span>(yes|no)<span style="color: #008080; font-weight: bold;">\&quot;</span>|'(yes|no)'))&quot;</span><span style="color: #008000;">;</span>
var xmlDecl <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'xmlDecl'&lt;\?xml&quot;</span> <span style="color: #008000;">+</span> versionInfo <span style="color: #008000;">+</span> encodingDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> sddecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\?&gt;)&quot;</span><span style="color: #008000;">;</span> 
var mixed <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'mixed'\(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\#PCDATA&quot;</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\|&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span><span style="color: #666666;">&quot;)*&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;\)\*|\(&quot;</span> <span style="color: #008000;">+</span>s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\#PCDATA&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\))&quot;</span><span style="color: #008000;">;</span>
var children <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'children'unsureifpossible)&quot;</span><span style="color: #008000;">;</span>
var contentSpec <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'contentspec'EMPTY|ANY|&quot;</span><span style="color: #008000;">+</span>mixed<span style="color: #008000;">+</span><span style="color: #666666;">&quot;|&quot;</span><span style="color: #008000;">+</span>children<span style="color: #008000;">+</span><span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var elementDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'elementdecl'&lt;!ELEMENT&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> contentSpec <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&gt;)&quot;</span><span style="color: #008000;">;</span>
var stringType <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;CDATA&quot;</span><span style="color: #008000;">;</span>
var tokenizedType <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(ID(REF(S)?)?|ENTIT(Y|IES)|NMTOKENS?)&quot;</span><span style="color: #008000;">;</span>
var notationType <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'notation'NOTATION&quot;</span> <span style="color: #008000;">+</span>s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;\(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\|&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\))&quot;</span><span style="color: #008000;">;</span>
var enumeration <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'enumeration'\(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> nmtoken <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\|&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> nmtoken <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?\))&quot;</span><span style="color: #008000;">;</span>
var enumeratedType <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'enumType'&quot;</span> <span style="color: #008000;">+</span> notationType <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> enumeration <span style="color: #008000;">+</span><span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var attType <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'attType'&quot;</span> <span style="color: #008000;">+</span> stringType <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> tokenizedType <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> enumeratedType <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var attValue <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'attValue'<span style="color: #008080; font-weight: bold;">\&quot;</span>([^&lt;&amp;<span style="color: #008080; font-weight: bold;">\&quot;</span>]|&quot;</span> <span style="color: #008000;">+</span>reference<span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*<span style="color: #008080; font-weight: bold;">\&quot;</span>|'([^&lt;&amp;']|&quot;</span> <span style="color: #008000;">+</span> reference <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*')&quot;</span><span style="color: #008000;">;</span>
var defaultDecl <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'defaultDecl'\#REQUIRED|\#IMPLIED|(\#FIXED&quot;</span><span style="color: #008000;">+</span>s<span style="color: #008000;">+</span><span style="color: #666666;">&quot;)?&quot;</span> <span style="color: #008000;">+</span> attValue <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var attDef <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'attDef'&quot;</span><span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> attType <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> defaultDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var attListDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'attlist'&lt;!ATTLIST&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> attDef <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;*&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&gt;)&quot;</span><span style="color: #008000;">;</span>
var systemLiteral <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'systemLiteral'<span style="color: #008080; font-weight: bold;">\&quot;</span>[^<span style="color: #008080; font-weight: bold;">\&quot;</span>]*<span style="color: #008080; font-weight: bold;">\&quot;</span>|'[^']*')&quot;</span><span style="color: #008000;">;</span>
var pubIdChar <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;[a-zA-Z0-9'()+,./:=?;!*#@$_%\u0020\u000d\u000a-]&quot;</span><span style="color: #008000;">;</span>
var pubidLiteral <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'pubIdLiteral'<span style="color: #008080; font-weight: bold;">\&quot;</span>&quot;</span> <span style="color: #008000;">+</span> pubIdChar <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;*<span style="color: #008080; font-weight: bold;">\&quot;</span>|'((?!')&quot;</span> <span style="color: #008000;">+</span> pubIdChar <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*')&quot;</span><span style="color: #008000;">;</span>
var externalID <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'externalID'SYSTEM&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> systemLiteral <span style="color: #008000;">+</span><span style="color: #666666;">&quot;|PUBLIC&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> pubidLiteral <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> systemLiteral<span style="color: #008000;">+</span><span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var nDataDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'ndatadecl'&quot;</span><span style="color: #008000;">+</span>s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;NDATA&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var entityDef  <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'entityDef'&quot;</span> <span style="color: #008000;">+</span> entityValue <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|(&quot;</span> <span style="color: #008000;">+</span>externalID <span style="color: #008000;">+</span> nDataDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?))&quot;</span><span style="color: #008000;">;</span>
var peDef <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'pedef'&quot;</span> <span style="color: #008000;">+</span> entityValue <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span>  <span style="color: #008000;">+</span> externalID <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var GEDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'gedecl'&lt;!ENTITY&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> entityDef <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&gt;)&quot;</span><span style="color: #008000;">;</span>
var PEDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'gedecl'&lt;!ENTITY&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;%&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> peDef <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&gt;)&quot;</span><span style="color: #008000;">;</span>
var entityDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'entityDecl'&quot;</span><span style="color: #008000;">+</span> GEDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> PEDecl <span style="color: #008000;">+</span><span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var publicID <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'publicID'PUBLIC&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> pubidLiteral <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var notationDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'notationDecl'&lt;!NOTATION&quot;</span> <span style="color: #008000;">+</span>  s <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;(&quot;</span> <span style="color: #008000;">+</span> externalID <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> publicID <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&gt;)&quot;</span><span style="color: #008000;">;</span>
var markupDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'markupdecl'&quot;</span> <span style="color: #008000;">+</span> elementDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> attListDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> entityDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> notationDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> PI <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> comment <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var DeclSep <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'declSep'&quot;</span> <span style="color: #008000;">+</span> pereference <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var intSubSet <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'intSubSet'(&quot;</span> <span style="color: #008000;">+</span> markupDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;|&quot;</span> <span style="color: #008000;">+</span> DeclSep <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*)&quot;</span><span style="color: #008000;">;</span> 
var docTypeDecl <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'doctypedecl'&lt;!DOCTYPE&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> externalID<span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)?&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?(\[&quot;</span> <span style="color: #008000;">+</span> intSubSet <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;\]&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?)?&gt;)&quot;</span><span style="color: #008000;">;</span> 
var prolog <span style="color: #008000;">=</span> xmlDecl <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&quot;</span> <span style="color: #008000;">+</span> misc <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;*(&quot;</span> <span style="color: #008000;">+</span> docTypeDecl <span style="color: #008000;">+</span> misc <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;*)?&quot;</span><span style="color: #008000;">;</span> 
var attribute <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;(?'attribute'&quot;</span> <span style="color: #008000;">+</span>name <span style="color: #008000;">+</span> eq <span style="color: #008000;">+</span> attValue <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span><span style="color: #008000;">;</span>
var CDSect <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'CDSect'&lt;!\[CDATA\[((?!\]\]&gt;)&quot;</span><span style="color: #008000;">+</span>c<span style="color: #008000;">+</span><span style="color: #666666;">@&quot;)*\]\]&gt;)&quot;</span><span style="color: #008000;">;</span>
var charData <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(((?!\]\]&gt;)[^&lt;&amp;])*)&quot;</span><span style="color: #008000;">;</span>
var content <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?&gt;&quot;</span> <span style="color: #008000;">+</span> <span style="color: #008080; font-style: italic;">// minor optimization... don't backtrack over this (makes failing faster)</span>
		<span style="color: #666666;">@&quot;&lt;(?'openclose'&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;)(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> attribute <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?/&gt;|&quot;</span><span style="color: #008000;">+</span>
		<span style="color: #666666;">@&quot;&lt;(?'open'&quot;</span><span style="color: #008000;">+</span> name <span style="color: #008000;">+</span><span style="color: #666666;">@&quot;)(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> attribute <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?&gt;|&quot;</span><span style="color: #008000;">+</span>
		<span style="color: #666666;">@&quot;&lt;/(?=\k'open'&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?&gt;)(?'close-open'&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span><span style="color: #666666;">@&quot;?&gt;|&quot;</span>
		<span style="color: #008000;">+</span>reference<span style="color: #008000;">+</span><span style="color: #666666;">@&quot;|&quot;</span>
		<span style="color: #008000;">+</span>PI<span style="color: #008000;">+</span><span style="color: #666666;">@&quot;|&quot;</span>
		<span style="color: #008000;">+</span>comment<span style="color: #008000;">+</span><span style="color: #666666;">@&quot;|&quot;</span>
		<span style="color: #008000;">+</span>CDSect<span style="color: #008000;">+</span><span style="color: #666666;">@&quot;|&quot;</span>
		<span style="color: #008000;">+</span>charData<span style="color: #008000;">+</span><span style="color: #666666;">@&quot;)*&quot;</span> <span style="color: #008000;">+</span> 
	<span style="color: #666666;">&quot;(?(open)(?!))&quot;</span><span style="color: #008000;">;</span>
var rootElement <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;(?'root'(&lt;(?'rootName'&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> attribute <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?&gt;&quot;</span> <span style="color: #008000;">+</span> content <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;&lt;/\k'rootName'&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;?&gt;)|(&lt;(?'rootName'&quot;</span> <span style="color: #008000;">+</span> name <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)(&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> attribute <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;)*&quot;</span> <span style="color: #008000;">+</span> s <span style="color: #008000;">+</span> <span style="color: #666666;">@&quot;?/&gt;))&quot;</span><span style="color: #008000;">;</span>
&nbsp;
var document <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;^&quot;</span> <span style="color: #008000;">+</span> prolog <span style="color: #008000;">+</span> rootElement <span style="color: #008000;">+</span> misc <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;*&quot;</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;$&quot;</span><span style="color: #008000;">;</span>
&nbsp;
var testDoc <span style="color: #008000;">=</span> <span style="color: #666666;">@&quot;&lt;?xml version='1.0' encoding=&quot;</span><span style="color: #666666;">&quot;utf-8&quot;</span><span style="color: #666666;">&quot;?&gt;&lt;!DOCTYPE nothtml []&gt;&lt;items&gt;
	&lt;item available=&quot;</span><span style="color: #666666;">&quot;yes&quot;</span><span style="color: #666666;">&quot; &gt;
		&lt;name&gt; laptop  &lt;/name&gt;
		&lt;![CDATA[something14!$]] 1412]]&gt;
		&lt;&quot;</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\U</span>00010000&quot;</span><span style="color: #008000;">+</span><span style="color: #666666;">@&quot;quantity&gt;  2 &amp;amp; &amp;#121; &amp;#x234f; &lt;/&quot;</span><span style="color: #008000;">+</span><span style="color: #666666;">&quot;<span style="color: #008080; font-weight: bold;">\U</span>00010000&quot;</span><span style="color: #008000;">+</span><span style="color: #666666;">@&quot;quantity&gt;
	&lt;/item&gt;&lt;?notxml?&gt;&quot;</span> <span style="color: #008080; font-style: italic;">/* or &lt;?xml?&gt; here */</span> <span style="color: #008000;">+</span><span style="color: #666666;">@&quot;
	&lt;item available=&quot;</span><span style="color: #666666;">&quot;yes&quot;</span><span style="color: #666666;">&quot; x='' y=&quot;</span><span style="color: #666666;">&quot;&amp;amp;&quot;</span><span style="color: #666666;">&quot;&gt;
		&lt;name&gt; mouse &lt;/name &gt;
		&lt;quantity&gt; 1 &quot;</span> <span style="color: #008000;">+</span> <span style="color: #008080; font-style: italic;">/* or ]]&gt; invalid here */</span>  <span style="color: #666666;">@&quot; &lt;/quantity&gt;
	&lt;/item&gt;
	&lt;item available=&quot;</span><span style="color: #666666;">&quot;no&quot;</span><span style="color: #666666;">&quot; &gt;
		&lt;!----&gt; &lt;!-- --&gt; &lt;!-- - --&gt;&quot;</span> <span style="color: #008000;">+</span> <span style="color: #008080; font-style: italic;">/* or &lt;!-- -- --&gt; here */</span> <span style="color: #666666;">@&quot;
		&lt;name&gt; keyboad &lt;/name&gt;
		&lt;quantity&gt; 0&lt;/quantity&gt;
	&lt;/item&gt;
&lt;/items&gt;&lt;!-- stuff can go here --&gt; &lt;!-- yup --&gt; &lt;?pi aasd as!@*&amp;$^!*@&amp;$!@ ?&gt;&quot;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">//Console.WriteLine(document);</span>
Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>Regex<span style="color: #008000;">.</span><span style="color: #0000FF;">Match</span><span style="color: #008000;">&#40;</span>testDoc, document, RegexOptions<span style="color: #008000;">.</span><span style="color: #0000FF;">IgnorePatternWhitespace</span><span style="color: #008000;">|</span>RegexOptions<span style="color: #008000;">.</span><span style="color: #0000FF;">Singleline</span><span style="color: #008000;">|</span>RegexOptions<span style="color: #008000;">.</span><span style="color: #0000FF;">ExplicitCapture</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<hr/>
<p>And here&#8217;s the regex (with apologies to <a href="http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html">Mail::RFC822::Address</a>):</p>
<p><code style="white-space:nowrap">^(?'xmlDecl'&lt;\?xml(?'versionInfo'([\u0020\u0009\u000d\u000a]+)version(?'eq'([\u0<br />
020\u0009\u000d\u000a]+)?=([\u0020\u0009\u000d\u000a]+)?)('1\.[0-9]+'|"1\.[0-9]+<br />
"))(?'encodingDecl'([\u0020\u0009\u000d\u000a]+)encoding(?'eq'([\u0020\u0009\u00<br />
0d\u000a]+)?=([\u0020\u0009\u000d\u000a]+)?)("(?'encName'[A-Za-z][A-Za-z0-9._-]*<br />
)"|'(?'encName'[A-Za-z][A-Za-z0-9._-]*)'))?(?'sddecl'([\u0020\u0009\u000d\u000a]<br />
+)standalone(?'eq'([\u0020\u0009\u000d\u000a]+)?=([\u0020\u0009\u000d\u000a]+)?)<br />
("(yes|no)"|'(yes|no)'))?([\u0020\u0009\u000d\u000a]+)?\?>)?(?'misc'(?'comment'&lt;<br />
!--((?!--)([\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\udbff][\udc0<br />
0-\udfff])))*-->)|(?'PI'&lt;\?(?'pitarget'(?![xX][mM][lL])(?'name'([:A-Z_a-z\u00C0-<br />
\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u<br />
218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc0<br />
0-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F<br />
-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\<br />
uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040]<br />
)*))(([\u0020\u0009\u000d\u000a]+)((?!\?>)([\u0009\u000a\u000d\u0020-\ud7ff\ue00<br />
0-\ufffd]|([\ud800-\udbff][\udc00-\udfff])))*)?\?>)|([\u0020\u0009\u000d\u000a]+<br />
))*((?'doctypedecl'&lt;!DOCTYPE([\u0020\u0009\u000d\u000a]+)(?'name'([:A-Z_a-z\u00C<br />
0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-<br />
\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\ud<br />
c00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u03<br />
7F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0<br />
-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u204<br />
0])*)(([\u0020\u0009\u000d\u000a]+)(?'externalID'SYSTEM([\u0020\u0009\u000d\u000<br />
a]+)(?'systemLiteral'"[^"]*"|'[^']*')|PUBLIC([\u0020\u0009\u000d\u000a]+)(?'pubI<br />
dLiteral'"[a-zA-Z0-9'()+,./:=?;!*#@$_%\u0020\u000d\u000a-]*"|'((?!')[a-zA-Z0-9'(<br />
)+,./:=?;!*#@$_%\u0020\u000d\u000a-])*')([\u0020\u0009\u000d\u000a]+)(?'systemLi<br />
teral'"[^"]*"|'[^']*')))?([\u0020\u0009\u000d\u000a]+)?(\[(?'intSubSet'((?'marku<br />
pdecl'(?'elementdecl'&lt;!ELEMENT([\u0020\u0009\u000d\u000a]+)(?'name'([:A-Z_a-z\u0<br />
0C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u207<br />
0-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\<br />
udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u<br />
037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFD<br />
F0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2<br />
040])*)([\u0020\u0009\u000d\u000a]+)(?'contentspec'EMPTY|ANY|(?'mixed'\(([\u0020<br />
\u0009\u000d\u000a]+)?\#PCDATA(([\u0020\u0009\u000d\u000a]+)?\|([\u0020\u0009\u0<br />
00d\u000a]+)?(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u0<br />
37D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDC<br />
F\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-<br />
\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u<br />
2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[<br />
-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*))*([\u0020\u0009\u000d\u000a]+)?\)\*|\(<br />
([\u0020\u0009\u000d\u000a]+)?\#PCDATA([\u0020\u0009\u000d\u000a]+)?\))|(?'child<br />
ren'unsureifpossible))([\u0020\u0009\u000d\u000a]+)?>)|(?'attlist'&lt;!ATTLIST([\u0<br />
020\u0009\u000d\u000a]+)(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02F<br />
F\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\<br />
uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u<br />
00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u21<br />
8F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-<br />
\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*)(?'attDef'([\u0020\u0009\u00<br />
0d\u000a]+)(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037<br />
D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\<br />
uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u<br />
00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2F<br />
EF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.<br />
0-9\u00B7\u0300-\u036F\u203F-\u2040])*)([\u0020\u0009\u000d\u000a]+)(?'attType'C<br />
DATA|(ID(REF(S)?)?|ENTIT(Y|IES)|NMTOKENS?)|(?'enumType'(?'notation'NOTATION([\u0<br />
020\u0009\u000d\u000a]+)\(([\u0020\u0009\u000d\u000a]+)?(?'name'([:A-Z_a-z\u00C0<br />
-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\<br />
u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc<br />
00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037<br />
F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-<br />
\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040<br />
])*)(([\u0020\u0009\u000d\u000a]+)?\|([\u0020\u0009\u000d\u000a]+)?(?'name'([:A-<br />
Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u2<br />
00D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\<br />
udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-<br />
\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\u<br />
FDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u<br />
203F-\u2040])*))*([\u0020\u0009\u000d\u000a]+)?\))|(?'enumeration'\(([\u0020\u00<br />
09\u000d\u000a]+)?(?'nmtoken'(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\<br />
u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF<br />
900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u<br />
036F\u203F-\u2040])+)(([\u0020\u0009\u000d\u000a]+)?\|([\u0020\u0009\u000d\u000a<br />
]+)?(?'nmtoken'(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u<br />
037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFD<br />
F0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2<br />
040])+))*([\u0020\u0009\u000d\u000a]+)?\))))([\u0020\u0009\u000d\u000a]+)(?'defa<br />
ultDecl'\#REQUIRED|\#IMPLIED|(\#FIXED([\u0020\u0009\u000d\u000a]+))?(?'attValue'<br />
"([^&lt;&amp;"]|(?'reference'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6<br />
\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u<br />
3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_<br />
a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200<br />
D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\ud<br />
bff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);())|&amp;\#([0-9]+|<br />
x[0-9a-fA-F]+);()))*"|'([^&lt;&amp;']|(?'reference'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00<br />
C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070<br />
-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\u<br />
dc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u0<br />
37F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF<br />
0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u20<br />
40])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*')))*([\u0020\u0009\u000d\u000a]+)?>)|<br />
(?'entityDecl'(?'gedecl'&lt;!ENTITY([\u0020\u0009\u000d\u000a]+)(?'name'([:A-Z_a-z\<br />
u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2<br />
070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff]<br />
[\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D<br />
\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\u<br />
FDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\<br />
u2040])*)([\u0020\u0009\u000d\u000a]+)(?'entityDef'(?'entityValue'"([^%&amp;"]|%(?'n<br />
ame'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\<br />
u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|(<br />
[\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02<br />
FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF<br />
\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300<br />
-\u036F\u203F-\u2040])*);|(?'reference'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u<br />
00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u21<br />
8F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-<br />
\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\<br />
u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uF<br />
FFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*<br />
);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*"|'([^%&amp;']|%(?'name'([:A-Z_a-z\u00C0-\u00D6<br />
\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u<br />
2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udf<br />
ff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FF<br />
F\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]<br />
|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);|(<br />
?'reference'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u0<br />
2FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7F<br />
F\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-<br />
\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u<br />
218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc0<br />
0-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-<br />
F]+);()))*')|((?'externalID'SYSTEM([\u0020\u0009\u000d\u000a]+)(?'systemLiteral'<br />
"[^"]*"|'[^']*')|PUBLIC([\u0020\u0009\u000d\u000a]+)(?'pubIdLiteral'"[a-zA-Z0-9'<br />
()+,./:=?;!*#@$_%\u0020\u000d\u000a-]*"|'((?!')[a-zA-Z0-9'()+,./:=?;!*#@$_%\u002<br />
0\u000d\u000a-])*')([\u0020\u0009\u000d\u000a]+)(?'systemLiteral'"[^"]*"|'[^']*'<br />
))(?'ndatadecl'([\u0020\u0009\u000d\u000a]+)NDATA([\u0020\u0009\u000d\u000a]+)(?<br />
'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FF<br />
F\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]<br />
|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u<br />
02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7<br />
FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u03<br />
00-\u036F\u203F-\u2040])*))?))([\u0020\u0009\u000d\u000a]+)?>)|(?'gedecl'&lt;!ENTIT<br />
Y([\u0020\u0009\u000d\u000a]+)%([\u0020\u0009\u000d\u000a]+)(?'name'([:A-Z_a-z\u<br />
00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u20<br />
70-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][<br />
\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\<br />
u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uF<br />
DF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u<br />
2040])*)([\u0020\u0009\u000d\u000a]+)(?'pedef'(?'entityValue'"([^%&amp;"]|%(?'name'(<br />
[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C<br />
-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud8<br />
00-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0<br />
370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF90<br />
0-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u03<br />
6F\u203F-\u2040])*);|(?'reference'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\<br />
u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2<br />
C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udff<br />
f]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF<br />
\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|<br />
([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);())<br />
|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*"|'([^%&amp;']|%(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D<br />
8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-<br />
\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))<br />
(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u20<br />
0C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\u<br />
d800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);|(?'ref<br />
erence'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u<br />
0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF9<br />
00-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D<br />
6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\<br />
u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\ud<br />
fff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);<br />
()))*')|(?'externalID'SYSTEM([\u0020\u0009\u000d\u000a]+)(?'systemLiteral'"[^"]*<br />
"|'[^']*')|PUBLIC([\u0020\u0009\u000d\u000a]+)(?'pubIdLiteral'"[a-zA-Z0-9'()+,./<br />
:=?;!*#@$_%\u0020\u000d\u000a-]*"|'((?!')[a-zA-Z0-9'()+,./:=?;!*#@$_%\u0020\u000<br />
d\u000a-])*')([\u0020\u0009\u000d\u000a]+)(?'systemLiteral'"[^"]*"|'[^']*')))([\<br />
u0020\u0009\u000d\u000a]+)?>))|(?'notationDecl'&lt;!NOTATION([\u0020\u0009\u000d\u0<br />
00a]+)(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u03<br />
7F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0<br />
-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\<br />
u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3<br />
001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u<br />
00B7\u0300-\u036F\u203F-\u2040])*)([\u0020\u0009\u000d\u000a]+)((?'externalID'SY<br />
STEM([\u0020\u0009\u000d\u000a]+)(?'systemLiteral'"[^"]*"|'[^']*')|PUBLIC([\u002<br />
0\u0009\u000d\u000a]+)(?'pubIdLiteral'"[a-zA-Z0-9'()+,./:=?;!*#@$_%\u0020\u000d\<br />
u000a-]*"|'((?!')[a-zA-Z0-9'()+,./:=?;!*#@$_%\u0020\u000d\u000a-])*')([\u0020\u0<br />
009\u000d\u000a]+)(?'systemLiteral'"[^"]*"|'[^']*'))|(?'publicID'PUBLIC([\u0020\<br />
u0009\u000d\u000a]+)(?'pubIdLiteral'"[a-zA-Z0-9'()+,./:=?;!*#@$_%\u0020\u000d\u0<br />
00a-]*"|'((?!')[a-zA-Z0-9'()+,./:=?;!*#@$_%\u0020\u000d\u000a-])*')))([\u0020\u0<br />
009\u000d\u000a]+)?>)|(?'PI'&lt;\?(?'pitarget'(?![xX][mM][lL])(?'name'([:A-Z_a-z\u0<br />
0C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u207<br />
0-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\<br />
udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u<br />
037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFD<br />
F0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2<br />
040])*))(([\u0020\u0009\u000d\u000a]+)((?!\?>)([\u0009\u000a\u000d\u0020-\ud7ff\<br />
ue000-\ufffd]|([\ud800-\udbff][\udc00-\udfff])))*)?\?>)|(?'comment'&lt;!--((?!--)([<br />
\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\udbff][\udc00-\udfff])))<br />
*-->))|(?'declSep'%(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u03<br />
70-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900<br />
-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\<br />
u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2<br />
C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udff<br />
f]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);|([\u0020\u0009\u000d\u000a]+)))<br />
*)\]([\u0020\u0009\u000d\u000a]+)?)?>)(?'misc'(?'comment'&lt;!--((?!--)([\u0009\u00<br />
0a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\udbff][\udc00-\udfff])))*-->)|(?'P<br />
I'&lt;\?(?'pitarget'(?![xX][mM][lL])(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u0<br />
0F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u300<br />
1-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z<br />
\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u<br />
2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff<br />
][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*))(([\u0020\u0009\u0<br />
00d\u000a]+)((?!\?>)([\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\ud<br />
bff][\udc00-\udfff])))*)?\?>)|([\u0020\u0009\u000d\u000a]+))*)?(?'root'(&lt;(?'root<br />
Name'(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037<br />
F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-<br />
\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u<br />
00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u30<br />
01-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u0<br />
0B7\u0300-\u036F\u203F-\u2040])*))(([\u0020\u0009\u000d\u000a]+)(?'attribute'(?'<br />
name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF<br />
\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|<br />
([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u0<br />
2FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7F<br />
F\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u030<br />
0-\u036F\u203F-\u2040])*)(?'eq'([\u0020\u0009\u000d\u000a]+)?=([\u0020\u0009\u00<br />
0d\u000a]+)?)(?'attValue'"([^&lt;&amp;"]|(?'reference'(?'entityRef'&amp;(?'name'([:A-Z_a-z\<br />
u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2<br />
070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff]<br />
[\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D<br />
\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\u<br />
FDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\<br />
u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*"|'([^&lt;&amp;']|(?'reference'(?'entityRe<br />
f'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-<br />
\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\u<br />
FFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00<br />
F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001<br />
-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B<br />
7\u0300-\u036F\u203F-\u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*')))*([\u0020<br />
\u0009\u000d\u000a]+)?>(?>&lt;(?'openclose'(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u<br />
00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2F<br />
EF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:<br />
A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\<br />
u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800<br />
-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*))(([\u0020\u<br />
0009\u000d\u000a]+)(?'attribute'(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00<br />
F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001<br />
-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\<br />
u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2<br />
070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff]<br />
[\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*)(?'eq'([\u0020\u0009<br />
\u000d\u000a]+)?=([\u0020\u0009\u000d\u000a]+)?)(?'attValue'"([^&lt;&amp;"]|(?'referenc<br />
e'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-<br />
\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\u<br />
FDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00<br />
D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00<br />
-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff])<br />
)|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*<br />
"|'([^&lt;&amp;']|(?'reference'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00<br />
F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF<br />
\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-<br />
Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u2<br />
00D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\<br />
udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);())|&amp;\#([0-9]<br />
+|x[0-9a-fA-F]+);()))*')))*([\u0020\u0009\u000d\u000a]+)?/>|&lt;(?'open'(?'name'([:<br />
A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\<br />
u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800<br />
-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u037<br />
0-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-<br />
\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F<br />
\u203F-\u2040])*))(([\u0020\u0009\u000d\u000a]+)(?'attribute'(?'name'([:A-Z_a-z\<br />
u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2<br />
070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff]<br />
[\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D<br />
\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\u<br />
FDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\<br />
u2040])*)(?'eq'([\u0020\u0009\u000d\u000a]+)?=([\u0020\u0009\u000d\u000a]+)?)(?'<br />
attValue'"([^&lt;&amp;"]|(?'reference'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\u00<br />
D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00<br />
-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff])<br />
)(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u2<br />
00C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\<br />
ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);())|&amp;\<br />
#([0-9]+|x[0-9a-fA-F]+);()))*"|'([^&lt;&amp;']|(?'reference'(?'entityRef'&amp;(?'name'([:A-<br />
Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u2<br />
00D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\<br />
udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-<br />
\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\u<br />
FDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u<br />
203F-\u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*')))*([\u0020\u0009\u000d\u00<br />
0a]+)?>|&lt;/(?=\k'open'([\u0020\u0009\u000d\u000a]+)?>)(?'close-open'(?'name'([:A-<br />
Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u2<br />
00D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\<br />
udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-<br />
\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\u<br />
FDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u<br />
203F-\u2040])*))([\u0020\u0009\u000d\u000a]+)?>|(?'reference'(?'entityRef'&amp;(?'na<br />
me'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u<br />
200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([<br />
\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02F<br />
F\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\<br />
uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-<br />
\u036F\u203F-\u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);())|(?'PI'&lt;\?(?'pitarget'(<br />
?![xX][mM][lL])(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\<br />
u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uF<br />
DCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D<br />
8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-<br />
\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))<br />
|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*))(([\u0020\u0009\u000d\u000a]+)((?!\?<br />
>)([\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\udbff][\udc00-\udfff<br />
])))*)?\?>)|(?'comment'&lt;!--((?!--)([\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd<br />
]|([\ud800-\udbff][\udc00-\udfff])))*-->)|(?'CDSect'&lt;!\[CDATA\[((?!\]\]>)([\u000<br />
9\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\udbff][\udc00-\udfff])))*\]\]<br />
>)|(((?!\]\]>)[^&lt;&amp;])*))*(?(open)(?!))&lt;/\k'rootName'([\u0020\u0009\u000d\u000a]+)<br />
?>)|(&lt;(?'rootName'(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u037<br />
0-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-<br />
\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u<br />
00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C<br />
00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff<br />
]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*))(([\u0020\u0009\u000d\u000a]+)(?'<br />
attribute'(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D<br />
\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\u<br />
FDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u0<br />
0F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FE<br />
F\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0<br />
-9\u00B7\u0300-\u036F\u203F-\u2040])*)(?'eq'([\u0020\u0009\u000d\u000a]+)?=([\u0<br />
020\u0009\u000d\u000a]+)?)(?'attValue'"([^&lt;&amp;"]|(?'reference'(?'entityRef'&amp;(?'nam<br />
e'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u2<br />
00C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\<br />
ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF<br />
\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\u<br />
F900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\<br />
u036F\u203F-\u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*"|'([^&lt;&amp;']|(?'referenc<br />
e'(?'entityRef'&amp;(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-<br />
\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\u<br />
FDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-z\u00C0-\u00D6\u00<br />
D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00<br />
-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff])<br />
)|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*);())|&amp;\#([0-9]+|x[0-9a-fA-F]+);()))*<br />
')))*([\u0020\u0009\u000d\u000a]+)?/>))(?'misc'(?'comment'&lt;!--((?!--)([\u0009\u0<br />
00a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\udbff][\udc00-\udfff])))*-->)|(?'<br />
PI'&lt;\?(?'pitarget'(?![xX][mM][lL])(?'name'([:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u<br />
00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u30<br />
01-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbff][\udc00-\udfff]))(([:A-Z_a-<br />
z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\<br />
u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]|([\ud800-\udbf<br />
f][\udc00-\udfff]))|[-.0-9\u00B7\u0300-\u036F\u203F-\u2040])*))(([\u0020\u0009\u<br />
000d\u000a]+)((?!\?>)([\u0009\u000a\u000d\u0020-\ud7ff\ue000-\ufffd]|([\ud800-\u<br />
dbff][\udc00-\udfff])))*)?\?>)|([\u0020\u0009\u000d\u000a]+))*$</code></p>
]]></content:encoded>
			<wfw:commentRss>http://porg.es/blog/so-it-turns-out-that-dot-nets-regex-are-more-powerful-than-i-originally-thought/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Computing with XSLT</title>
		<link>http://porg.es/blog/computing-with-xslt</link>
		<comments>http://porg.es/blog/computing-with-xslt#comments</comments>
		<pubDate>Thu, 19 Jul 2007 02:34:18 +0000</pubDate>
		<dc:creator>Porges</dc:creator>
				<category><![CDATA[Cool]]></category>
		<category><![CDATA[Functional programming]]></category>
		<category><![CDATA[Haskell]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSLT]]></category>

		<guid isPermaLink="false">http://porg.es/blog/computing-with-xslt</guid>
		<description><![CDATA[Since XSLT is basically a pattern-matching functional programming language, we should be able to use it to compute. I&#8217;m going to use it to implement one of the most basic functions: Peano-style addition. First of all we have to have an idea of what the numbers look like. We want to simulate this in XSL: [...]]]></description>
			<content:encoded><![CDATA[<p>Since XSLT is basically a pattern-matching functional programming language, we should be able to use it to compute. I&#8217;m going to use it to implement one of the most basic functions: Peano-style addition.</p>
<p>First of all we have to have an idea of what the numbers look like. We want to simulate this in XSL:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;"><span style="color: #06c; font-weight: bold;">data</span> Nat <span style="color: #339933; font-weight: bold;">=</span> Zero <span style="color: #339933; font-weight: bold;">|</span> Succ Nat</pre></div></div>

<p>Using XSD we can have something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;complexType</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Nat&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;choice<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Zero&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;element</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;Succ&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;Nat&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/choice<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/complexType<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p><small>(Note that this is not tested, and probably wrong!)</small></p>
<p>However, since I don&#8217;t have an XSLT processor on hand that can deal with XSD types, I had to drop this course of action (although I still used the introduced type for the data). The type gives data like this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Succ<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;Succ<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;Zero</span><span style="color: #000000; font-weight: bold;">/&gt;</span><span style="color: #000000; font-weight: bold;">&lt;/Succ<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/Succ<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>&#8230;in this case standing for the number two. Now the idea of addition on these numbers is given by a function:</p>

<div class="wp_syntax"><div class="code"><pre class="haskell" style="font-family:monospace;">add Zero y <span style="color: #339933; font-weight: bold;">=</span> y
add <span style="color: green;">&#40;</span>Succ x<span style="color: green;">&#41;</span> y <span style="color: #339933; font-weight: bold;">=</span> Succ <span style="color: green;">&#40;</span>add x y<span style="color: green;">&#41;</span></pre></div></div>

<p>Since this function involves pattern-matching it is an ideal candidate for implementation in XSLT, and it looks something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;UTF-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:stylesheet</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;2.0&quot;</span> </span>
<span style="color: #009900;"><span style="color: #000066;">xmlns:xsl</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/1999/XSL/Transform&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
	<span style="color: #808080; font-style: italic;">&lt;!-- apply the add function to two numbers --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;add&quot;</span> <span style="color: #000066;">match</span>=<span style="color: #ff0000;">&quot;add&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:apply-templates</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;adder&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;*[1]&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;rest&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;*[2]&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:apply-templates<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #808080; font-style: italic;">&lt;!-- add Succ(x) y = Succ(add x y) --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;addSucc&quot;</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;adder&quot;</span> <span style="color: #000066;">match</span>=<span style="color: #ff0000;">&quot;Succ&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;rest&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Succ<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:apply-templates</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;adder&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
				<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:with-param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;rest&quot;</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$rest&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
			<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:apply-templates<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Succ<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
	<span style="color: #808080; font-style: italic;">&lt;!-- add Zero y = y --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:template</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;addZero&quot;</span> <span style="color: #000066;">mode</span>=<span style="color: #ff0000;">&quot;adder&quot;</span> <span style="color: #000066;">match</span>=<span style="color: #ff0000;">&quot;Zero&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:param</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;rest&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
		<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xsl:copy-of</span> <span style="color: #000066;">select</span>=<span style="color: #ff0000;">&quot;$rest&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:template<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
&nbsp;
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xsl:stylesheet<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>The first template matches any occurances of <code>&lt;add/&gt;</code>, and calls the real &#8216;add&#8217; function on them. It passes the second number as a parameter, while the first is what the function actually recurses on&mdash;exactly as in the Haskell example. The rest proceeds similarly.</p>
<p>You can <a href="http://www.w3.org/2005/08/online_xslt/xslt?xslfile=http%3A%2F%2Fporg.es%2Fprocessor.xsl&#038;xmlfile=http%3A%2F%2Fporg.es%2Fdata.xml&#038;content-type=&#038;submit=transform">test it yourself</a> by using the W3C online XSLT processor, which uses <a href="http://porg.es/processor.xsl">my processor</a> and <a href="http://porg.es/data.xml">some sample input data</a>. It should work for any similar data that you can throw at it as well. In this case it is adding 2 + 2 and coming up with 4, as we expect <img src="http://porg.es/blog/wp-content/plugins/wp-smiley-switcher/noktahhitam/icon_smile.gif" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://porg.es/blog/computing-with-xslt/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Baleegal!</title>
		<link>http://porg.es/blog/baleegal</link>
		<comments>http://porg.es/blog/baleegal#comments</comments>
		<pubDate>Sat, 24 Jun 2006 11:37:45 +0000</pubDate>
		<dc:creator>Porges</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Reference]]></category>
		<category><![CDATA[Unicode]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://porg.es/blog/baleegal</guid>
		<description><![CDATA[XML 1.0 allows you to insert characters from the C1 control code range, whilst those from the C0 range are outright forbidden. XML 1.1 allows you to insert characters from the C0 range as long as they are escaped as character entity references, and mandates that you do the same for those from the C1 [...]]]></description>
			<content:encoded><![CDATA[<p>XML 1.0 allows you to insert characters from the C1 control code range, whilst those from the C0 range are outright forbidden.</p>
<p>XML 1.1 allows you to insert characters from the C0 range <em>as long as they are escaped as character entity references</em>, and mandates that you do the same for those from the C1 range.</p>
<p>This little fact is the reason why not all XML 1.0-valid documents are valid under XML 1.1. Nasty.</p>
]]></content:encoded>
			<wfw:commentRss>http://porg.es/blog/baleegal/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

