我有一个由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>
我无法在这个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表达式,以使用上面提到的名称空间前缀。