Render XML report using XSL transform

  • Hi, I am upgrading reports from 2005 to 2008R2 and I noticed that two reports are failing on the new server. So, after looking up its issue, I realized that I might need to rewrite XSL that was formatting the XML output/render...

    So, my scenario is as such:

    the report renders xml with root node <Report blah blah bla> and then it renders my xml, with its own root like I need it. So it's kinda double wrapped, it's still full and proper xml after the render.

    I got to the point where I get <?xml version="1.0"?> at the top of the rendered file, and then I have that <Report blah name blah> root that I have to remove... It's pretty confusing, spent all day searching for an answer.

    How do I go about removing the first line and the <Report....> root from final rendered results?

    <?xml version="1.0" encoding="utf-8"?>

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"

    >

    <xsl:output method="xml" encoding="ascii" omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="@* | node()">

    <xsl:copy>

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

    </xsl:copy>

    </xsl:template>

    </xsl:stylesheet>

    I'd appreciate some help here.

  • Have you got an example before/after xml that you can post as that may help

  • Yes, I can

    Current Result:

    <?xml version="1.0"?>

    -<Report xmlns="test_3">

    test_3

    <Document>

    <Assessments>

    <Assessment>

    <Date>05/01/2013</Date>

    <Type>Physical</Type>

    <Completed>1</Completed>

    </Assessment>

    <Assessment>

    <Date>06/14/2013</Date>

    <Type>Physical</Type>

    <Completed>0</Completed>

    </Assessment>

    </Assessments>

    </Document>

    </Report>

    Wanted result:

    <Document>

    <Assessments>

    <Assessment>

    <Date>05/01/2013</Date>

    <Type>Physical</Type>

    <Completed>1</Completed>

    </Assessment>

    <Assessment>

    <Date>06/14/2013</Date>

    <Type>Physical</Type>

    <Completed>0</Completed>

    </Assessment>

    </Assessments>

    </Document>

  • I'm not very good at XSL myself, but does this get you what you need?

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="test_3">

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

    <xsl:template match="/">

    <xsl:copy><xsl:apply-templates select="/a:Report/a:Document"/></xsl:copy>

    </xsl:template>

    <xsl:template match="*">

    <xsl:element name="{local-name(.)}">

    <xsl:apply-templates/>

    </xsl:element>

    </xsl:template>

    </xsl:stylesheet>

  • Unfortunately it's exactly the same thing as before. But thanks for trying 🙂

  • danka_6786978 (7/25/2013)


    Unfortunately it's exactly the same thing as before. But thanks for trying 🙂

    That's odd then.. When i pass your "Current Result" xml example through that style sheet, it outputs in the format of your "Wanted Result" xml...

    Like I say, i'm not an XSL expert so not sure to be honest..

  • I re-ran it, I think I made a mistake when copying the xsl from her, sorry ... So, now that I corrected it, I only get an error: "XML document must have a top level element. Error processing resource file:...."

  • thx a lot for this information

  • danka_6786978 (7/24/2013)


    Hi, I am upgrading reports from 2005 to 2008R2 and I noticed that two reports are failing on the new server. So, after looking up its issue, I realized that I might need to rewrite XSL that was formatting the XML output/render...

    So, my scenario is as such:

    the report renders xml with root node <Report blah blah bla> and then it renders my xml, with its own root like I need it. So it's kinda double wrapped, it's still full and proper xml after the render.

    I got to the point where I get <?xml version="1.0"?> at the top of the rendered file, and then I have that <Report blah name blah> root that I have to remove... It's pretty confusing, spent all day searching for an answer.

    How do I go about removing the first line and the <Report....> root from final rendered results?

    <?xml version="1.0" encoding="utf-8"?>

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"

    >

    <xsl:output method="xml" encoding="ascii" omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="@* | node()">

    <xsl:copy>

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

    </xsl:copy>

    </xsl:template>

    </xsl:stylesheet>

    I'd appreciate some help here.

    I know I am a little late here but... You were close, you just needed to change the context in you template match statement to begin at Report.

    <?xml version="1.0" encoding="utf-8"?>

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"

    >

    <xsl:output method="xml" encoding="ascii" omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="Report/@* | Report/node()">

    <xsl:copy>

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

    </xsl:copy>

    </xsl:template>

    </xsl:stylesheet>

    "I cant stress enough the importance of switching from a sequential files mindset to set-based thinking. After you make the switch, you can spend your time tuning and optimizing your queries instead of maintaining lengthy, poor-performing code."

    -- Itzik Ben-Gan 2001

Viewing 9 posts - 1 through 8 (of 8 total)

You must be logged in to reply to this topic. Login to reply