当根元素具有名称空间时,转换失败

时间:2014-08-07 06:56:29

标签: xml xslt reporting-services xslt-1.0

我有一个由MS SQLserver报告服务器生成的XML格式的报告。根元素在其中有一个名称空间声明,如源xml代码片段

中所示
<?xml version="1.0" encoding="utf-8"?>
<data xsi:schemaLocation="course http://<sqlserveraddress>/ReportServer?%7C4ke03n45bssdhbvwcrhnst45%7C%40%7C%2FPepi%2FAngus%20Development%2FPreTerm%2Fcourse%7C&amp;rs%3ACommand=Render&amp;rs%3AFormat=XML&amp;rs%3ASessionID=y14z41zpzcfdms45pz2iab55&amp;rc%3ASchema=True" 
Name="course" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="course">
<Tablix1>
<Details_Collection>
<Details action="create" fullname="The TV Commercial" Shortname="SCM147-7841" startdate="1405296000" idnum="7841" Code="SCM147" />
<Details action="create" fullname="Scoring Emotion" Shortname="SCM132-7842" startdate="1405296000" idnum="7842" Code="SCM132" />
</Details_Collection>
</Tablix1>
</data>

即使我尝试按照以下帖子中的说明在XLST中声明名称空间,我也无法在此xml源上使用XLST进行转换 Namespace Stopping XSLT Working

我正在使用以下XLST

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:course="http://<sqlserveraddress/ReportServer>">
<xsl:template match="/">
<xsl:element name="data">
    <xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/course:Report/Tablix1/Details_Collection/Details[@action='create']">
<xsl:element name="datum" >
    <xsl:attribute name="action">create</xsl:attribute>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

我已尝试使用源根元素命名空间声明中的完整查询字符串,但仍然没有运气。

如果我在源XML文档上删除名称空间声明,那么我得到一个转换,以便XSL正常工作。也许我只是不理解根元素名称空间声明的语法,有人可以向我解释一下吗?

此致

安格斯

1 个答案:

答案 0 :(得分:2)

一个问题是您的XML和XSLT中的命名空间声明是不同的,并且您还没有在XSLT中正确引用命名空间。

在XML中,您可以定义默认命名空间

 <data xmlns="course">

这意味着此数据元素,并且所有后代节点都是&#34;课程&#34;命名空间。这里的单词课程实际上是一个&#34;名称空间URI&#34;。

现在在您的XSLT中执行此操作

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

(我假设你刚刚在这里使用尖括号,以便不显示sql server名称)。

在这种情况下,当你xmlns:course="..."然后&#34;当然&#34;是名称空间前缀,而不是名称空间URI本身。实际的名称空间URI是您的http://<sqlserveraddress/ReportServer>,它与XML中使用的名称空间不同。前缀实际上可以是您选择的任何内容,它是必须匹配的名称空间URI。前缀实际上是为了方便您保存在多个位置编写URI。

如果有命名空间,还必须确保在任何xpath表达式中的所有元素中都使用前缀。所以,你必须这样做

<xsl:template match="/course:Report/course:Tablix1/course:Details_Collection/course:Details[@action='create']">

(当然,这也在寻找报告元素,这在XML中不存在。)

因此,简而言之,您可能需要更改XSLT中的命名空间声明以匹配XSLT

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

然后更改与源XML匹配的任何xpath表达式,以使用上面提到的名称空间前缀。