Xml 如何在rss中使用带有命名空间的自定义标记?

Xml 如何在rss中使用带有命名空间的自定义标记?,xml,xslt,Xml,Xslt,我正在尝试为rss提要创建带有名称空间的自定义标记。我在下面列出了我的两个文件rss.xml和rss.xsl,以供参考。如果我从xml文档中删除rss元素,它就可以正常工作。对于rss元素,它不起作用 有人知道吗 这是我的XML文档-rss.XML <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="rss.xsl"?> <rss version='2.

我正在尝试为rss提要创建带有名称空间的自定义标记。我在下面列出了我的两个文件rss.xml和rss.xsl,以供参考。如果我从xml文档中删除rss元素,它就可以正常工作。对于rss元素,它不起作用

有人知道吗

这是我的XML文档-rss.XML

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version='2.0' xmlns:SL="http://mywebsite.com/course.xsd">
<channel><description>mywebsite Course RSS Feed</description><link>http://www.mywebsite.com</link><title>mywebsite Courses</title>
<SL:Courses>
<SL:Course>
<SL:ID>18</SL:ID>
<SL:Name>ITIL<sup>®</sup> Foundation</SL:Name>
<SL:WorkshopId>17369</SL:WorkshopId>
<SL:PackageId>46</SL:PackageId>
<SL:Dates>11-Jan-2014,12-Jan-2014</SL:Dates>
<SL:StartDate>11-Jan-2014</SL:StartDate>
<SL:EndDate>12-Jan-2014</SL:EndDate>
<SL:StartTiming>09:30</SL:StartTiming>
<SL:EndTiming>18:30</SL:EndTiming>
<SL:CityId>55</SL:CityId>
<SL:CityName>PUNE</SL:CityName>
<SL:CountryId>6</SL:CountryId>
<SL:CountryName>INDIA</SL:CountryName>
</SL:Course>
</SL:Courses>
</channel>
</rss>

我的网站课程rssfeedhttp://www.mywebsite.commywebsite 课程
18
IITL®基金会
17369
46
2014年1月11日,2014年1月12日
2014年1月11日
2014年1月12日
09:30
18:30
55
浦那
6.
印度
这是我的xsl文档-rss.xsl

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="html" indent="yes" doctype-system='http://www.w3.org/TR/html4/strict.dtd' doctype-public='-//W3C//DTD HTML 4.01//EN' />

<xsl:template match="/">
<html>
<head>
<title>test</title>
</head>
<body>
<xsl:apply-templates select="//*[local-name()='Courses']" />
</body>
</html>
</xsl:template>

<xsl:template match="//*[local-name()='Courses']">
<table cellpadding="2" cellspacing="0" border="0" width="75%">
<xsl:apply-templates select="//*[local-name()='Course']" />
</table>
</xsl:template>

<xsl:template match="//*[local-name()='Course']">
<!-- ... -->
<tr>
<td colspan="2" style="text-align:left;padding-top:10px;">
<xsl:value-of select="//*[local-name()='Name']" disable-output-escaping="yes" /><br />
</td>
<td colspan="2" style="text-align:left;padding-top:10px;">
<xsl:value-of select="//*[local-name()='Dates']" disable-output-escaping="yes" /><br />
</td>
</tr>
<!-- ... -->
</xsl:template>
</xsl:stylesheet>

测试



编辑(感谢@nwellnhof):
rss
元素没有前缀
SL:
。因此,即使它为其子元素分配了一个名称空间,它也会保持默认名称空间

换句话说,如果希望模板与
rss
匹配,则无需添加名称空间前缀。另一方面,要匹配
rss
的后代,需要声明它们的命名空间(或使用
local-name()

因此,输入XML中的名称空间也必须在XSLT样式表中声明:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:SL="http://mywebsite.com/course.xsd">

现在,如何重写样式表?从匹配文档节点开始,就像您已经做的那样:

<xsl:template match="/">
以下模板必须包括
SL
前缀,例如:

<xsl:template match="SL:Name">


rss元素仍在默认名称空间中,因此
SL:rss
将不起作用。是的,您完全正确。我应该去喝咖啡。但在此之前,我会编辑我的帖子。谢谢你的回复。我按照您的建议编辑了xsl文件。但是没有运气。我在这里发送更新的xsl文件。请检查并让我知道我是否在这里做错了什么,谢谢
<xsl:template match="rss">
  <xsl:apply-templates/>
</xsl:template>
<xsl:template match="SL:Name">