user2607367
user2607367

Reputation: 225

Coying an entire xml in a Variable using xslt

How can i copy an entire xml as is in an Variable?

Below is the sample xml:

  <?xml version="1.0" encoding="UTF-8"?>
      <products author="Jesper">
         <product id="p1">
            <name>Delta</name>
            <price>800</price>
            <stock>4</stock>
         </product>
      </products>

I have tried below xslt but it is not working.

     <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
        <xsl:output method="xml" indent="yes"/>
        <xsl:template match="@*|node()">
            <xsl:variable name="reqMsg">
                <xsl:copy>
                   <xsl:apply-templates select="@*|node()"/>
                </xsl:copy>
           </xsl:variable>
       <xsl:copy-of select="$reqMsg"/>
    </xsl:template>
   </xsl:stylesheet>

Regards, Rahul

Upvotes: 0

Views: 1555

Answers (2)

Lumi
Lumi

Reputation: 15294

<xsl:copy-of select="document('path/to/file.xml')" />

Or if you need it more than once, to avoid repeating the doc name:

<xsl:variable name="filepath" select="'path/to/file.xml'" />
…
<xsl:copy-of select="document($filepath)" />

The result of document() should be cached IIRC, so don't worry about calling it repeatedly.

Upvotes: 1

nwellnhof
nwellnhof

Reputation: 33658

Your transformation fails because at a certain point, it tries to create a variable (result tree fragment) containing an attribute node. This is not allowed.

It's not really clear what you mean by "copying an entire XML to a variable". But you probably want to simply use the select attribute on the root node:

<xsl:variable name="reqMsg" select="/"/>

This will actually create variable with a node-set containing the root node of the document. Using this variable with xsl:copy-of will output the whole document.

Upvotes: 1

Related Questions