#Namespace tracer from Pawson, David <DPawson@rnib.org.uk> on 10 March 2000, with a version using the namespace axis from David Carlisle.

from Xml.Xslt import test_harness

sheet_1 = """<?xml version='1.0'?>

<xsl:stylesheet 
   version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:ns-test="http://ns1.com"
   xmlns:ns1="http://ns1.com"
   xmlns:ns2="http://ns2.com"
   xmlns:long-namespace="http://ns3.com"
   exclude-result-prefixes="ns1 ns2 long-namespace"
>

<xsl:output method="xml" indent="yes"/>

<xsl:template match="*">
  <!--<xsl:message><xsl:value-of select="name(.)"/></xsl:message>-->
  <tag>Namespace:<xsl:choose><xsl:when test="namespace-uri(.)"><xsl:value-of select="namespace-uri(.)"/>
      </xsl:when>
      <xsl:otherwise> Null namespace</xsl:otherwise>
    </xsl:choose>
  </tag>
  <tag>name: <xsl:value-of select="name(.)"/></tag>
  <tag>local-name: <xsl:value-of select="local-name(.)"/></tag>
  <tag>Content: <xsl:value-of select="text()"/></tag>
  <xsl:if test="./*"><xsl:apply-templates/></xsl:if>
</xsl:template>

</xsl:stylesheet>"""


sheet_2 = """<?xml version='1.0'?>

<xsl:stylesheet 
   version="1.0" 
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:ns-test="http://ns1.com"
   xmlns:ns1="http://ns1.com"
   xmlns:ns2="http://ns2.com"
   xmlns:long-namespace="http://ns3.com"
   exclude-result-prefixes="ns1 ns2 long-namespace"
>

<xsl:output method="xml" indent="yes"/>

<xsl:template match="*">
  <tag>Namespace:<xsl:choose><xsl:when test="namespace-uri(.)"><xsl:value-of select="namespace-uri(.)"/>
    </xsl:when>
    <xsl:otherwise> Null namespace</xsl:otherwise>
  </xsl:choose>

  <!-- namespaces are unordered, sort is needed for comparision only -->
    <xsl:for-each select="namespace::*">
      <xsl:sort select="name()"/>
      NS name: <xsl:value-of select="name(.)"/>
      NS value : <xsl:value-of select="."/>
    </xsl:for-each>

  </tag>
  <xsl:if test="./*"><xsl:apply-templates/></xsl:if>
</xsl:template>

</xsl:stylesheet>
"""


source_1="""<?xml version='1.0'?>

<!DOCTYPE ns1:ns-test [
<!ELEMENT ns1:ns-test (block)+>
<!ATTLIST ns-test  xmlns:ns1 CDATA #FIXED "http://ns1.com"
          
>
<!ELEMENT ns2:block (para)+>
<!ATTLIST block  xmlns:ns2 CDATA #FIXED "http://ns2.com"
>
<!ELEMENT para (#PCDATA)>
<!ATTLIST para id ID #IMPLIED
               another CDATA #IMPLIED>]>

<ns1:ns-test xmlns:ns1= "http://ns1.com">

  <block>
    <para>Para in block 1, main document namespace </para>
  </block>

  <ns2:block xmlns:ns2="http://ns2.com">
    <para>Para in block 2</para>
  </ns2:block>

    <ns3:block xmlns:ns3="http://ns3.com">
      <long:para xmlns:long="A long namespace uri">Para in block
3</long:para>
    </ns3:block>


</ns1:ns-test>"""


expected_1 = """<?xml version="1.0" encoding="UTF-8"?>
<tag>Namespace:http://ns1.com</tag>
<tag>name: ns1:ns-test</tag>
<tag>local-name: ns-test</tag>
<tag>Content: 

  </tag>

  <tag>Namespace: Null namespace</tag>
<tag>name: block</tag>
<tag>local-name: block</tag>
<tag>Content: 
    </tag>
    <tag>Namespace: Null namespace</tag>
<tag>name: para</tag>
<tag>local-name: para</tag>
<tag>Content: Para in block 1, main document namespace </tag>
  

  <tag>Namespace:http://ns2.com</tag>
<tag>name: ns2:block</tag>
<tag>local-name: block</tag>
<tag>Content: 
    </tag>
    <tag>Namespace: Null namespace</tag>
<tag>name: para</tag>
<tag>local-name: para</tag>
<tag>Content: Para in block 2</tag>
  

    <tag>Namespace:http://ns3.com</tag>
<tag>name: ns3:block</tag>
<tag>local-name: block</tag>
<tag>Content: 
      </tag>
      <tag>Namespace:A long namespace uri</tag>
<tag>name: long:para</tag>
<tag>local-name: para</tag>
<tag>Content: Para in block
3</tag>
    


"""


expected_2 = """<?xml version="1.0" encoding="UTF-8"?>
<tag>Namespace:http://ns1.com
      NS name: ns1
      NS value : http://ns1.com
      NS name: xml
      NS value : http://www.w3.org/XML/1998/namespace</tag>

  <tag>Namespace: Null namespace
      NS name: ns1
      NS value : http://ns1.com
      NS name: ns2
      NS value : http://ns2.com
      NS name: xml
      NS value : http://www.w3.org/XML/1998/namespace</tag>
    <tag>Namespace: Null namespace
      NS name: ns1
      NS value : http://ns1.com
      NS name: ns2
      NS value : http://ns2.com
      NS name: xml
      NS value : http://www.w3.org/XML/1998/namespace</tag>
  

  <tag>Namespace:http://ns2.com
      NS name: ns1
      NS value : http://ns1.com
      NS name: ns2
      NS value : http://ns2.com
      NS name: xml
      NS value : http://www.w3.org/XML/1998/namespace</tag>
    <tag>Namespace: Null namespace
      NS name: ns1
      NS value : http://ns1.com
      NS name: ns2
      NS value : http://ns2.com
      NS name: xml
      NS value : http://www.w3.org/XML/1998/namespace</tag>
  

    <tag>Namespace:http://ns3.com
      NS name: ns1
      NS value : http://ns1.com
      NS name: ns3
      NS value : http://ns3.com
      NS name: xml
      NS value : http://www.w3.org/XML/1998/namespace</tag>
      <tag>Namespace:A long namespace uri
      NS name: long
      NS value : A long namespace uri
      NS name: ns1
      NS value : http://ns1.com
      NS name: ns3
      NS value : http://ns3.com
      NS name: xml
      NS value : http://www.w3.org/XML/1998/namespace</tag>
    


"""

def Test(tester):
    source = test_harness.FileInfo(string=source_1)
    sheet = test_harness.FileInfo(string=sheet_1)
    test_harness.XsltTest(tester, source, [sheet], expected_1,
                          title='test 1')

    source = test_harness.FileInfo(string=source_1)
    sheet = test_harness.FileInfo(string=sheet_2)
    test_harness.XsltTest(tester, source, [sheet], expected_2,
                          title='test 2')
    return
    
