<xsl:transform version="2.0"
               xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:f="http://www.w3.org/2008/05/XMLSchema-misc">

  <xsl:param name="newTargetNamespace" as="xs:anyURI" 
      required="yes"/>
  <xsl:param name="prefixForTargetNamespace" as="xs:NCName" 
      select="f:generateUniquePrefix(., 0)"/>

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

  <xsl:template match="xs:schema">
    <xsl:copy>
     <xsl:namespace name="{$prefixForTargetNamespace}" 
       select="$newTargetNamespace"/>
     <xsl:apply-templates select="@*"/>
     <xsl:attribute name="targetNamespace" 
       select="$newTargetNamespace"/>
     <xsl:apply-templates/>
   </xsl:copy>
  </xsl:template>

  <xsl:template match="attribute(*, xs:QName)
      [namespace-uri-from-QName(.)='']">
    <xsl:attribute name="{name()}" 
      select="concat($prefixForTargetNamespace, 
                     ':', 
                     local-name-from-QName(.))"/>
  </xsl:template>

  <xsl:template match="@memberTypes">
    <xsl:variable name="context" select=".."/>
    <xsl:variable name="values" as="xs:string+">
       <xsl:for-each select="tokenize(., '\s+')">
          <xsl:variable name="oldValue" 
                        select="resolve-QName(., $context)" 
                        as="xs:QName"/>
          <xsl:sequence 
             select="if (namespace-uri-from-QName($oldValue) eq '') 
                then concat($prefixForTargetNamespace, ':', 
                            local-name-from-QName($oldValue))
                else string(.)"/>
       </xsl:for-each>
    </xsl:variable>
    <xsl:attribute name="{name()}" select="string-join($values, ' ')"/> 
  </xsl:template>


  <xsl:function name="f:generateUniquePrefix" as="xs:NCName">
    <xsl:param name="xsd"/>
    <xsl:param name="try" as="xs:integer"/>
    <xsl:variable name="disallowed" 
      select="distinct-values($xsd//*/in-scope-prefixes(.))"/>
    <xsl:variable name="candidate" 
      select="xs:NCName(concat('p', $try))"/>
    <xsl:sequence select="if ($candidate = $disallowed) then 
                                f:generateUniquePrefix($xsd, $try+1) 
                             else 
                                $candidate"/>
  </xsl:function>

</xsl:transform>