使用XSLT从SSRS/VisionStudio导出到XML



我正试图通过Visual Studio 2008 R2(BIDS)或SSRS从RDL文件导出,使用XSLT文件创建XML。

导出会产生以下xml代码

<?xml version="1.0" encoding="utf-8"?>
<Report xsi:schemaLocation="testreport http://reportserver?%2Ftestreport&amp;rs%3AFormat=XML&amp;rc%3ASchema=True" Name="testreport"             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="testreport">
 <ProductList>
  <Details_Collection>
   <Details>
    <ID>602</ID>
    <Title>302</Title>
   </Details>
   <Details>
    <ID>603</ID>
    <Title>303</Title>
   </Details>
  </Details_Collection>
 </ProductList>
</Report> 

从这个网站上的另一篇文章中,我得到了以下XSLT代码:

<?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 https://stackoverflow.com/questions/857010/xsl-avoid-exporting-namespace-defintions-to-resulting-xml-documents-->
  <!-- see https://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>

当应用XSLT时,导出会产生以下XML代码

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <Report>
      <ProductList>
        <Details_Collection>
          <Details>
            <ID>602</ID>
            <Title>302</Title>
          </Details>
          <Details>
            <ID>603</ID>
            <Title>303</Title>
          </Details> 
        </Details_Collection>
      </ProductList>
    </Report>
  </channel>
</rss>

我在这里没看到什么?"Report"、"ProductList"、"Details_Collection"不应出现在输出中,"Detail"元素应命名为"item"。元素似乎无法按名称命名(似乎正在工作的元素的唯一模板匹配项是"/""*""/*")。我从来没有做到用一个特定元素的名字来称呼它。

我期待着这样的东西:

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
     <item>
         <ID>602</ID>
         <Title>302</Title>
      </item>
      <item>
         <ID>603</ID>
         <Title>303</Title>
      </item> 
  </channel>
</rss>

有人能帮我吗?干杯Commx

您的输入XML位于命名空间中,即默认命名空间:

<Report xmlns="testreport">

所有子代元素也将属于此命名空间。在您的案例中,重要的是元素Report和名为{testreport}Report的元素({}告诉您存在名称空间)是完全不同的元素。

所以,如果你的模板匹配

<xsl:template match="Report">

只有在未在命名空间中找到名为"Report"的元素时才会触发它。相反如果您需要处理特定元素的名称,并且它们在名称空间中,则需要在XSLT样式表中声明该名称空间,并在这些元素名称前面加上前缀:

<xsl:stylesheet xmlns:tst="testreport">
  <xsl:template match="tst:Report">
    <!--...-->
  </xsl:template>
  <!--...-->
</xsl:stylesheet>

你观察到

似乎正在工作的元素的唯一模板匹配是"/""*""/*"

因为这些模式是通用模式,不使用需要前缀的特定元素名称。

XSLT样式表

更多细节:无需在样式表中重新定义xsi名称空间-我省略了它。此外,一些处理器保留了空白节点,这会导致输出格式不正确-我添加了xsl:strip-space来说明这一点。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
    xmlns:tst="testreport"
    exclude-result-prefixes="tst">
  <xsl:output method="xml" indent="yes" encoding="utf-8" />
  <xsl:strip-space elements="*"/>
  <!-- rule to suppress the undesired nodes -->
  <xsl:template match="tst:Report|tst:ProductList|tst:Details_Collection">
    <xsl:apply-templates/>
  </xsl:template>
  <!-- rule to rename the Details node -->
  <xsl:template match="tst:Details">
    <item>
      <xsl:apply-templates/>
    </item>
  </xsl:template>
  <!-- rule to copy everything else -->
  <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>

XML输出

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <item>
         <ID>602</ID>
         <Title>302</Title>
      </item>
      <item>
         <ID>603</ID>
         <Title>303</Title>
      </item>
   </channel>
</rss>

相关内容

  • 没有找到相关文章

最新更新