SSRS XML reformating using xslt during export

二次信任 提交于 2019-12-11 20:21:06

问题


I am trying to create data feed in following format,

    <rss version="2.0">
    <channel>
    <Title>FeedTitle</Title>
    <link>http://www.mydomain.com</link>
    <description>My Products</description>
    <item>
        <Id>10890</Id>
        <Title>Benetton 01</Title>
    </item>
    <item>
        <Id>10700</Id>
        <Title>Benetton 02</Title>
    </item>
    </channel>
    </rss>

BUT,Reporting Services export option has generated following xml data feed which doesn't work on Google Merchant Center.

    <Report xsi:schemaLocation="pg_google_data_feed http://reportserver?%2Fpg_google_data_feed&rs%3AFormat=XML&rc%3ASchema=True" Name="pg_google_data_feed">
    <Title>FeedTitle</Title>
    <link>http://www.mydomain.com</link>
    <description>My Products</description>
    <ProductList>
        <Details_Collection>
            <Details>
                <Id>10890</Id>
                <Title>Benetton 01</Title>
            </Details>
            <Details>
                <Id>10700</Id>
                <Title>Benetton 02</Title>
            </Details>
                   </Details_Collection>
    </ProductList>
    </Report>

It would be very helpful if any body tell me what type of XSLT would required to reformat the XML data into another xml file.

EDIT :

step 1. Created xslt file using following code.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:template match="Details">
        <Details>
            <xsl:for-each select="@*">
                <xsl:element name="{name(.)}">
                    <xsl:value-of select="." />
                </xsl:element>
            </xsl:for-each>
        </Details>
    </xsl:template>
</xsl:stylesheet>

Step 2: set Property of report to "datafeed.xslt"

Without applying xslt to my ssrs report result appears like this,

    <Report xsi:schemaLocation="pg_google_data_feed http://reportserver?%2Fpg_google_data_feed&rs%3AFormat=XML&rc%3ASchema=True" Name="pg_google_data_feed">
        <Title>FeedTitle</Title>
        <link>http://www.mydomain.com</link>
        <description>My Products</description>
        <ProductList>
            <Details_Collection>
                <Details>
                    <Id>1000</Id>
                </Details>
                <Details>
                     <Id>1000</Id>
                 </Details>
             </Details_Collection> 
        </ProductList>
    </Report>    

if i attached above mentioned xslt to the report through DataTransform Property, am getting following output.

XML Parsing Error: syntax error
Location: file:///C:/Documents%20and%20Settings/Administrator/Desktop/pg_google_data_feed.xml
Line Number 1, Column 39:<?xml version="1.0" encoding="utf-8"?>1089010947109191093310895108921092406598115141151311512
--------------------------------------^

Thank you in advance Sudhakar


回答1:


With a slightly updated wrapper around your input

<?xml version="1.0" encoding="ISO-8859-1"?>
<Report 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="pg_google_data_feed http://reportserver?%2Fpg_google_data_feed&amp;rs%3AFormat=XML&amp;rc%3ASchema=True" Name="pg_google_data_feed">
  <!-- everything else stays the same here -->
</Report>

the following XSLT will provide the required conversions and filtering

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    exclude-result-prefixes="xsi">
  <xsl:output method="xml" indent="yes" encoding="utf-8" />

  <!-- rule to suppress the undesired nodes -->
  <xsl:template match="Report|ProductList|Details_Collection">
    <xsl:apply-templates/>
  </xsl:template>

  <!-- rule to rename the Details node -->
  <xsl:template match="Details">
    <item>
      <xsl:apply-templates/>
    </item>
  </xsl:template>

  <!-- rule to copy everything else -->
  <!-- see http://stackoverflow.com/questions/857010/xsl-avoid-exporting-namespace-defintions-to-resulting-xml-documents-->
  <!-- see http://stackoverflow.com/questions/14166259/xslt-default-template-confusion -->
  <xsl:template match="*|@*">
    <xsl:element name="{name()}">
      <xsl:apply-templates/>
    </xsl:element>
  </xsl:template>

  <!-- rule to start the conversion and provide the wrapper tags -->
  <xsl:template match="/">
    <rss version="2.0">
      <channel>
        <xsl:apply-templates/>
      </channel>
    </rss>
  </xsl:template>

</xsl:stylesheet>

Notes:

  • This XSLT does just the conversion of one XML into another. You should setup a test environment to check just this aspect before you proceed.
  • As a second step you should make the modifications (if required) to integrate the XSLT into the automatic processing setup that you seem to have. I have noted that string "pg_google_data_feed http://reportserver?%2Fpg_google_data_feed&rs%3AFormat=XML&rc%3ASchema=True" does not seem to be valid since it contains unquoted ampersands. You may want to use "pg_google_data_feed http://reportserver?%2Fpg_google_data_feed&amp;rs%3AFormat=XML&amp;rc%3ASchema=True" instead.


来源:https://stackoverflow.com/questions/19593664/ssrs-xml-reformating-using-xslt-during-export

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!