我无法让我的XML读取我的XSLT样式表。我使用的是Framework - CodeIgniter - 因此可能会也可能不会成为问题的一部分。
这是我的观看代码;
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="<?php echo base_url("assets/style.xsl") ?>" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc><?php echo site_url();?></loc>
<priority>1.0</priority>
</url>
<?php echo $file_list; ?>
<url>
<loc><?php echo site_url("release-calendar/upcoming-releases"); ?></loc>
<priority>0.7</priority>
</url>
<url>
<loc><?php echo site_url("release-calendar/currently-released"); ?></loc>
<priority>0.7</priority>
</url>
<url>
<loc><?php echo site_url("calendar/changes"); ?></loc>
<priority>0.7</priority>
</url>
<?php echo $file_list_2; ?>
<url>
<loc><?php echo site_url("cookies"); ?></loc>
<priority>0.7</priority>
</url>
<url>
<loc><?php echo site_url("contact_us"); ?></loc>
<priority>0.7</priority>
</url>
</urlset>
这是我的XSLT代码;
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
<xsl:for-each select="url">
<tr>
<td><xsl:value-of select="loc"/></td>
<td><xsl:value-of select="priority"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
目前,站点地图网页甚至没有在IE9中显示,但在Firefox中显示。在Firefox中,它实际上是渲染XML(但忽略了样式)。
如果这意味着什么,前三行在源代码中使用Firefox为红色文字......
样式表的链接必须正确,因为我使用的css样式表几乎完全相同。
编辑 - 一些额外信息;
这是我的输出呈现的内容;
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://www.example.com/index.php/</loc>
<priority>1.0</priority>
</url>
<url>
<loc>http://www.example.com/index.php/doc1.pdf</loc>
<priority>0.5</priority>
</url>
<url>
<loc>http://www.example.com/index.php/doc2.pdf</loc>
<priority>0.5</priority>
</url>
<url>
<loc>http://www.example.com/index.php/doc3.pdf</loc>
<priority>0.5</priority>
</url>
<url>
<loc>http://www.example.com/index.php/doc4.pdf</loc>
<priority>0.5</priority>
</url>
</urlset>
对我来说似乎很好..
答案 0 :(得分:3)
围绕XML
的根元素存在一些问题<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
您已在此处指定了默认命名空间,这意味着此元素和所有后代(除非被另一个命名空间声明覆盖)属于该命名空间。但是在XSLT中根本没有提到名称空间,因此所有的XPath表达式都在寻找NO名称空间中的元素。
你需要在XSLT中做的是首先声明你的命名空间,就像这样(前缀'sm'可以是任何东西,只要uri与XML中的那个匹配)
<xsl:stylesheet version="1.0"
xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
然后,无论您在xpath表达式中引用元素,都应该使用名称空间前缀作为前缀。例如
<xsl:for-each select="sm:url">
<tr>
<td><xsl:value-of select="sm:loc"/></td>
<td><xsl:value-of select="sm:priority"/></td>
</tr>
</xsl:for-each>
另一个问题是,您首先匹配文档节点<xsl:template match="/">
,但在此模板中,您可以为 url 元素执行xsl:for-each。但此时, urlset 元素将成为直接子元素。尝试将初始模板匹配更改为此
<xsl:template match="/sm:urlset">
然后, xsl:for-each 应该找到一些东西。
当然,可能还有其他问题。您需要确保使用PHP输出的XML格式正确,一开始。