我有一个由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&rs%3ACommand=Render&rs%3AFormat=XML&rs%3ASessionID=y14z41zpzcfdms45pz2iab55&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正常工作。也许我只是不理解根元素名称空间声明的语法,有人可以向我解释一下吗?
此致
安格斯
答案 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表达式,以使用上面提到的名称空间前缀。