#Uche gets nasty with nested copies and other arcana (too bad we had to ixnay the namespace axis hacking)

from 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:es="http://www.snowboard-info.com/EndorsementSearch.wsdl"
  xmlns:esxsd="http://schemas.snowboard-info.com/EndorsementSearch.xsd"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>

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

  <!-- template 1 -->
  <xsl:template match='wsdl:definitions'>
    <xsl:copy>
      <xsl:apply-templates select='@*'/>
      <xsl:apply-templates select='*'/>
      <rdf:RDF>
        <xsl:apply-templates select='*' mode='convert-to-rdf'/>
      </rdf:RDF>
    </xsl:copy>
  </xsl:template>

  <!-- template 2 -->
  <xsl:template match='wsdl:message|wsdl:portType|wsdl:binding|wsdl:service|wsdl:operation|wsdl:port' mode='convert-to-rdf'>
    <xsl:copy>
      <xsl:attribute name='rdf:ID' namespace='http://www.w3.org/1999/02/22-rdf-syntax-ns#'><xsl:value-of select='@name'/></xsl:attribute>
      <xsl:apply-templates select='@*' mode='convert-to-rdf'/>
      <xsl:apply-templates select='*'/>
      <xsl:apply-templates select='*' mode='convert-to-rdf'/>
    </xsl:copy>
  </xsl:template>

  <!-- template 3 -->
  <xsl:template match='wsdl:part' mode='convert-to-rdf'>
    <xsl:copy>
      <xsl:apply-templates select='@*' mode='convert-to-rdf'/>
      <xsl:apply-templates select='*'/>
      <xsl:apply-templates select='*' mode='convert-to-rdf'/>
    </xsl:copy>
  </xsl:template>

  <!-- template 4 -->
  <xsl:template match='wsdl:message|wsdl:portType|wsdl:binding|wsdl:service|wsdl:operation|wsdl:port|wsdl:part'/>

  <!-- template 5 -->
  <xsl:template match='@*' mode='convert-to-rdf'>
    <xsl:attribute name="{concat('wsdl', ':', name(.))}"
                   namespace='{namespace-uri(.)}'>
      <xsl:value-of select='.'/>
    </xsl:attribute>
  </xsl:template>

  <!-- template 6 -->
  <xsl:template match='*' mode='convert-to-rdf'/>

  <!-- template 7 -->
  <xsl:template match='*|@*'>
    <xsl:copy>
      <xsl:apply-templates select='@*|node()'/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>"""


source_1 = """<?xml version="1.0"?>
<definitions name="EndorsementSearch"
  targetNamespace="http://namespaces.snowboard-info.com"
  xmlns:es="http://www.snowboard-info.com/EndorsementSearch.wsdl"
  xmlns:esxsd="http://schemas.snowboard-info.com/EndorsementSearch.xsd"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns="http://schemas.xmlsoap.org/wsdl/"
>
  <types>
    <schema targetNamespace="http://namespaces.snowboard-info.com"
            xmlns="http://www.w3.org/1999/XMLSchema">
      <element name="GetEndorsingBoarder">
        <complexType>
          <sequence>
            <element name="manufacturer" type="string"/>
            <element name="model" type="string"/>
          </sequence>
        </complexType>
      </element>
      <element name="GetEndorsingBoarderResponse">
        <complexType>
          <all>
            <element name="endorsingBoarder" type="string"/>
          </all>
        </complexType>
      </element>
      <element name="GetEndorsingBoarderFault">
        <complexType>
          <all>
            <element name="errorMessage" type="string"/>
          </all>
        </complexType>
      </element>
    </schema>
  </types>

  <message name="GetEndorsingBoarderRequest">
    <part name="body" element="esxsd:GetEndorsingBoarder"/>
  </message>

  <message name="GetEndorsingBoarderResponse">
    <part name="body" element="esxsd:GetEndorsingBoarderResponse"/>
  </message>

  <portType name="GetEndorsingBoarderPortType">
    <operation name="GetEndorsingBoarder">
      <input message="es:GetEndorsingBoarderRequest"/>
      <output message="es:GetEndorsingBoarderResponse"/>
      <fault message="es:GetEndorsingBoarderFault"/>
    </operation>
  </portType>
    
  <binding name="EndorsementSearchSoapBinding"
           type="es:GetEndorsingBoarderPortType">
    <soap:binding style="document"
                  transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="GetEndorsingBoarder">
      <soap:operation
        soapAction="http://www.snowboard-info.com/EndorsementSearch"/>
      <input>
        <soap:body use="literal"
          namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/>
      </input>
      <output>
        <soap:body use="literal"
          namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/>
      </output>
      <fault>
        <soap:body use="literal"
          namespace="http://schemas.snowboard-info.com/EndorsementSearch.xsd"/>
      </fault>
    </operation>
  </binding>
    
  <service name="EndorsementSearchService">
    <documentation>snowboarding-info.com Endorsement Service</documentation> 
    <port name="GetEndorsingBoarderPort"
          binding="es:EndorsementSearchSoapBinding">
      <soap:address location="http://www.snowboard-info.com/EndorsementSearch"/>
    </port>
  </service>

</definitions>"""


expected_1 = """<?xml version='1.0' encoding='UTF-8'?>
<definitions xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/' name='EndorsementSearch' targetNamespace='http://namespaces.snowboard-info.com' xmlns='http://schemas.xmlsoap.org/wsdl/' xmlns:esxsd='http://schemas.snowboard-info.com/EndorsementSearch.xsd' xmlns:es='http://www.snowboard-info.com/EndorsementSearch.wsdl'>
  <types>
    <schema xmlns='http://www.w3.org/1999/XMLSchema' targetNamespace='http://namespaces.snowboard-info.com'>
      <element name='GetEndorsingBoarder'>
        <complexType>
          <sequence>
            <element name='manufacturer' type='string'/>
            <element name='model' type='string'/>
          </sequence>
        </complexType>
      </element>
      <element name='GetEndorsingBoarderResponse'>
        <complexType>
          <all>
            <element name='endorsingBoarder' type='string'/>
          </all>
        </complexType>
      </element>
      <element name='GetEndorsingBoarderFault'>
        <complexType>
          <all>
            <element name='errorMessage' type='string'/>
          </all>
        </complexType>
      </element>
    </schema>
  </types>
  <rdf:RDF xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
    <message rdf:ID='GetEndorsingBoarderRequest' wsdl:name='GetEndorsingBoarderRequest'>
      <part wsdl:element='esxsd:GetEndorsingBoarder' wsdl:name='body'/>
    </message>
    <message rdf:ID='GetEndorsingBoarderResponse' wsdl:name='GetEndorsingBoarderResponse'>
      <part wsdl:element='esxsd:GetEndorsingBoarderResponse' wsdl:name='body'/>
    </message>
    <portType rdf:ID='GetEndorsingBoarderPortType' wsdl:name='GetEndorsingBoarderPortType'>
      <operation rdf:ID='GetEndorsingBoarder' wsdl:name='GetEndorsingBoarder'>
        <input message='es:GetEndorsingBoarderRequest'/>
        <output message='es:GetEndorsingBoarderResponse'/>
        <fault message='es:GetEndorsingBoarderFault'/>
      </operation>
    </portType>
    <binding rdf:ID='EndorsementSearchSoapBinding' wsdl:type='es:GetEndorsingBoarderPortType' wsdl:name='EndorsementSearchSoapBinding'>
      <soap:binding transport='http://schemas.xmlsoap.org/soap/http' style='document'/>
      <operation rdf:ID='GetEndorsingBoarder' wsdl:name='GetEndorsingBoarder'>
        <soap:operation soapAction='http://www.snowboard-info.com/EndorsementSearch'/>
        <input>
        <soap:body use='literal' namespace='http://schemas.snowboard-info.com/EndorsementSearch.xsd'/>
      </input>
        <output>
        <soap:body use='literal' namespace='http://schemas.snowboard-info.com/EndorsementSearch.xsd'/>
      </output>
        <fault>
        <soap:body use='literal' namespace='http://schemas.snowboard-info.com/EndorsementSearch.xsd'/>
      </fault>
      </operation>
    </binding>
    <service rdf:ID='EndorsementSearchService' wsdl:name='EndorsementSearchService'>
      <documentation>snowboarding-info.com Endorsement Service</documentation>
      <port rdf:ID='GetEndorsingBoarderPort' wsdl:binding='es:EndorsementSearchSoapBinding' wsdl:name='GetEndorsingBoarderPort'>
        <soap:address location='http://www.snowboard-info.com/EndorsementSearch'/>
      </port>
    </service>
  </rdf:RDF>
</definitions>"""

#"

def Test(tester):
    source = test_harness.FileInfo(string=source_1)
    sty = test_harness.FileInfo(string=sheet_1)
    xtest = test_harness.XsltTester(source,
                                    [sty],
                                    expected_1,
                                    )

    xtest.test(tester)
    return
