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



我有一个由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>

我无法在这个xml源上使用XLST进行转换,即使我尝试按照以下帖子中的描述在XLST中声明名称空间名称空间停止XSLT工作

我使用下面的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就可以工作了。也许我只是不明白根元素命名空间声明的语法,有人能给我解释一下吗?

安格斯

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

在XML中定义一个默认的命名空间

 <data xmlns="course">

这意味着这个data元素,以及所有的后代节点都是"course"命名空间的一部分。这里的单词course实际上是一个"命名空间URI"。

现在在XSLT中输入

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

(我假设你只是在这里使用尖括号,以便不显示你的sql服务器名称)。

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

如果确实有名称空间,还必须确保在任何xpath表达式中的所有元素中都使用前缀。因此,你需要输入

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

(当然,这也是在寻找Report元素,它不存在于您的XML中)。因此,简而言之,您可能需要更改XSLT中的名称空间声明以匹配XSLT

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

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

相关内容

  • 没有找到相关文章

最新更新