我正在尝试使用rss feed的命名空间创建自定义标记。我列出了我的两个文件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>
这是我的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>
答案 0 :(得分:2)
编辑(感谢@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">
请注意,命名空间不是使用local-name()
可以避免的瘟疫,而是一种识别元素的可靠方法。如果您添加带有前缀SL
的命名空间,如上所示,只需将模板匹配前缀SL
- 而不是匹配其本地名称:
<xsl:template match="SL:Courses">
现在,如何重写样式表?首先匹配文档节点,如下所示:
<xsl:template match="/">
然后,插入匹配rss
的模板(n.b。,不带名称空间前缀),例如:
<xsl:template match="rss">
<xsl:apply-templates/>
</xsl:template>
以下模板必须包含SL
前缀,例如:
<xsl:template match="SL:Name">