<?xml version="1.0" encoding="UTF-8" ?>


<!-- TODO use sensible namespace for my:, and change prefix -->

<xsl:stylesheet
  xmlns:my='http://example.org/xxx'
  xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
  xmlns:xhtml2='http://www.w3.org/2002/06/xhtml2'
  xmlns:x='file://attributes.to.be.stripped.in.second.pass'
  xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:axml='file://xml.namespace.alias'
  version='2.0'
  xmlns:a='file://attributes.to.be.stripped.in.first.pass'
>

  <xsl:output
    method='xml'
    indent='no'
   />
   
   <xsl:variable name="uri-curie-prefix">\[</xsl:variable>
   <xsl:variable name="uri-curie-infix">:</xsl:variable>
   <xsl:variable name="uri-curie-postfix">\]</xsl:variable>
   
   <xsl:variable name="bare-curie-prefix"></xsl:variable>
   <xsl:variable name="bare-curie-infix">:</xsl:variable>
   <xsl:variable name="bare-curie-postfix"></xsl:variable>

  <xsl:template
        match='/*'
      >
        <xsl:text>&#10;</xsl:text>
        <rdf:RDF>
        <xsl:text>&#10;</xsl:text>
           <xsl:apply-templates select="*"/>
        <xsl:text>&#10;</xsl:text>
                </rdf:RDF>
  </xsl:template>
  <xsl:template priority="2" match="*[@about or @nodeID or @rel or @rev or @content or @href or @property]">
        <xsl:copy-of select="my:toRDF(.)"/>
        <xsl:apply-templates select="*" />
  </xsl:template>
  <xsl:template match="*">
        <xsl:apply-templates select="*" />
  </xsl:template>
      
  <xsl:function name="my:resolve-uri-curie">
         <xsl:param name="u"/>
         <xsl:param name="c"/>
         <xsl:if test="my:is-uri-curie($u)">
            <xsl:value-of select="my:resolve-curie(my:split-uri-curie($u),$c)"/>
         </xsl:if>
         <xsl:if test="not(my:is-uri-curie($u))">
            <xsl:if test="$u eq ''">
                <xsl:value-of select="base-uri($c)"/>
            </xsl:if>
            <xsl:if test="$u ne ''">
                <xsl:value-of select="resolve-uri($u,base-uri($c))"/>
            </xsl:if>
         </xsl:if>
  </xsl:function>
  
  <xsl:function name="my:bnode-uri-curie" as="xs:string">
         <xsl:param name="u"/>
         <xsl:variable name="curie"
           select="my:split-uri-curie($u)"/>
           
         <xsl:if test="$curie[1] eq '_'">
       <!-- TODO assumes that the bnode is legal NCNameChars -->                             
            <xsl:value-of select="concat('u.',$curie[2])"/>
         </xsl:if>
         
         <xsl:if test="$curie[1] ne '_' or empty($curie)">
            <xsl:text/>
         </xsl:if>
         
  </xsl:function>
  
  <xsl:function name="my:curie-to-qname">
         <xsl:param name="u"/>
         <xsl:param name="c"/>
    <!-- TODO assumes bare-infix is : -->
         <xsl:value-of select="$u"/>
  </xsl:function>
  
  <xsl:function name="my:resolve-curie">
         <xsl:param name="curie"/>
         <xsl:param name="c"/>
         
         <xsl:if test="$curie[1] ne '_'">
            <xsl:value-of select="namespace-uri-for-prefix($curie[1],$c)"/>                             
            <xsl:value-of select="$curie[2]"/>
         </xsl:if>
         
  </xsl:function>
  
  
  <xsl:function name="my:resolve-bare-curie">
         <xsl:param name="curie"/>
         <xsl:param name="c"/>
         <xsl:value-of select="my:resolve-curie(my:split-bare-curie($curie),$c)"/>
  </xsl:function>
  
  
  <xsl:function name="my:is-uri-curie">
         <xsl:param name="u"/>
         <xsl:copy-of select="not(empty(my:split-uri-curie($u)))"/>
  </xsl:function>
  
  <xsl:function name="my:split-uri-curie">
         <xsl:param name="u"/>
         <xsl:copy-of select="my:split($u,$uri-curie-prefix,$uri-curie-infix,$uri-curie-postfix)"/> 
  </xsl:function>
  
  
  <xsl:function name="my:split-bare-curie">
         <xsl:param name="u"/>
         <xsl:copy-of select="my:split($u,$bare-curie-prefix,$bare-curie-infix,$bare-curie-postfix)"/> 
  </xsl:function>
  
  
  <xsl:function name="my:uri-curie-to-bare-curie">
         <xsl:param name="u"/>
  </xsl:function>
  
  <xsl:function name="my:split">
         <xsl:param name="x"/>
         <xsl:param name="prefix"/>
         <xsl:param name="infix"/>
         <xsl:param name="postfix"/>
         
         <xsl:if test="matches($x,concat('^',$prefix)) and matches($x,concat($postfix,'$'))">
             <xsl:variable name="prefix-stripped" 
                           select="replace($x,concat('^',$prefix),'')"/>
             <!-- TODO ncname here -->
             <xsl:if test="matches($prefix-stripped,concat('^.*',$infix))">
                 <xsl:variable name="infix-stripped" 
                           select="replace($prefix-stripped,concat('^.*',$infix),'')"/>
             <!-- TODO this code assumes infix of length 1 -->
                  <xsl:copy-of
                       select="substring($prefix-stripped,1,
                           string-length($prefix-stripped)-string-length($infix-stripped)-1)"/>         
                  <xsl:copy-of                
                       select="replace($infix-stripped,concat($postfix,'$'),'')"/>
                        
             </xsl:if>
         </xsl:if>
  </xsl:function>
  
 </xsl:stylesheet>

