我正试图通过Visual Studio 2008 R2(BIDS)或SSRS从RDL文件导出,使用XSLT文件创建XML。
导出会产生以下xml代码
<?xml version="1.0" encoding="utf-8"?>
<Report xsi:schemaLocation="testreport http://reportserver?%2Ftestreport&rs%3AFormat=XML&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>