views:

48

answers:

2

Hi,

I hope you can help... Let's assume I have following XML:

<data>
   <token>
      <sessionId>12345</sessionId>         
      <userId>john</userId>
      <moreInfo>
         <bla> .....
         </bla>
      </moreInfo>
   </token>
</data>

And I need this to become

<login:data xmlns:login="http://my.ns.uri"&gt;
       <login:token>
          <login:sessionId>12345</sessionId>         
          <login:userId>john</userId>
          <login:moreInfo>
             <login:bla> .....
             </login:bla>
          </login:moreInfo>
       </login:token>
    </login:data>

Can I do this with XSL? I did try but failed miserably ... Any help would be greatly appreciated!

Thanks, Jan

A: 
<xsl:template match="*">
  <xsl:element name="{local-name()}" namespace="http://my.ns.uri"&gt;
    <xsl:apply-templates />
  </xsl:element>
</xsl:template>
Boldewyn
All right, I understand this. But how can I change the prefixes of all the elements?
Jan
Prefixes are something, that is quite fluid in XML. I mean, that the spec says explicitly, that they are *arbitrary*. So, your XSLT processor would be free to change them to whatever it likes. However, every (known to me) XSLT engine re-uses the prefixes that you wrote in your opening `<xsl:stylesheet>` tag, if there aren't reasons to not do this (like XSLT's `exclude-result-prefix`).
Boldewyn
Ok, let me play with this .... Thank you!
Jan
+2  A: 

Use:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:login="http://my.ns.uri"&gt;
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="*">
  <xsl:element name="login:{name()}" namespace="http://my.ns.uri"&gt;
    <xsl:copy-of select="namespace::*"/>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:element>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the provided XML document, the wanted, correct result is produced:

<login:data xmlns:login="http://my.ns.uri"&gt;
   <login:token>
      <login:sessionId>12345</login:sessionId>
      <login:userId>john</login:userId>
      <login:moreInfo>
         <login:bla> .....
         </login:bla>
      </login:moreInfo>
   </login:token>
</login:data>
Dimitre Novatchev
Thanks a lot, that's exactly what I meant and needed, you saved me from a bad headache :)
Jan