<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:d="data:,dpc"
   xmlns:xs="http://www.w3.org/2001/XMLSchema"
   exclude-result-prefixes="d xs">
  
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" encoding="US-ASCII" omit-xml-declaration="yes"/>
<xsl:variable name="UD" select="tokenize(unparsed-text('UnicodeData-5.1.0d10.txt'),'[&#10;&#13;]+')"/>
<xsl:variable name="uc" select="doc('unicode.xml')"/>

<xsl:key name="char" match="character" use="@id"/>

<xsl:template name="main">
  <xsl:result-document href="uc-new.xml">
    <xsl:processing-instruction name="xml-stylesheet">type="text/xsl" href="unicode.xsl"</xsl:processing-instruction>
    <xsl:text>&#10;</xsl:text>
    <xsl:copy-of select="$uc/comment()"/>
    <xsl:text>&#10;</xsl:text>
    <unicode>
      <xsl:copy-of select="$uc/unicode/(node() except charlist)"/>
      <charlist>
      <xsl:perform-sort>
	<xsl:sort select="@id"/>
	<xsl:sequence select="$uc/unicode/charlist/character"/>
	<xsl:for-each select="$UD">
	  <xsl:analyze-string select="." regex="^([^;]*);([A-Z][^;]*);([^;]*);.*">
	    <xsl:matching-substring>
	      <!--
		  <xsl:message>
		  <xsl:value-of select="position(),'===',.,concat('U',if(string-length(regex-group(1))=4) then '0' else '',regex-group(1))"/>
		  </xsl:message>
	      -->
	      <xsl:if test="not(key('char',concat('U',if(string-length(regex-group(1))=4) then '0' else '',regex-group(1)),$uc))">
		<character id="{concat('U',if(string-length(regex-group(1))=4) then '0' else '',regex-group(1))}"
			   dec="{d:hexs(regex-group(1))}"
			   image="none">
		  <unicodedata>
		    <xsl:variable name="u" select="tokenize(.,';')"/>
		    <xsl:for-each select="$udfields">
		      <xsl:variable name="p" select="position()"/>
		      <xsl:if test="$p gt 2 and $u[$p]">
			<xsl:attribute name="{.}" select="$u[$p]"/>
		      </xsl:if>
		    </xsl:for-each>
		  </unicodedata>
		  <description unicode="5.1"><xsl:value-of select="regex-group(2)"/></description>
		</character>
	      </xsl:if>
	    </xsl:matching-substring>
	  </xsl:analyze-string>
	</xsl:for-each>
      </xsl:perform-sort>
    </charlist>
    </unicode>
  </xsl:result-document>
</xsl:template>

<xsl:variable name="udfields" select="('code',
				       'name','category','combclass','bidi','decomp','decimal','digit','numeric','mirror','unicode1','comment','upper','lower','title')"/>




<xsl:function name="d:hex" as="xs:integer">
<xsl:param name="x"/>
  <xsl:value-of
    select="if (empty($x)) then 0 else ($x[last()] + 16* d:hex($x[position()!=last()]))"/>
</xsl:function>

<xsl:function name="d:hexs">
  <xsl:param name="x"/>
     <xsl:sequence select="d:hex(
           for $i in string-to-codepoints($x)
           return if ($i &gt; 64) then $i - 55 else $i - 48)"/>
</xsl:function>

<xsl:variable name="hexd" select="('1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','0')"/>
<xsl:function name="d:dtoh">
   <xsl:param name="d"/>
     <xsl:value-of select="'000',$hexd[$d idiv 16],$hexd[$d mod 16]" separator=""/>
</xsl:function>

</xsl:stylesheet>