1

我无法让我的 XML 读取我的 XSLT 样式表。我正在使用一个框架 - 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(但只是忽略了样式)。

如果这意味着什么,前 3 行是使用 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>

对我来说似乎很好。。

4

1 回答 1

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>

另一个问题是您从匹配文档节点开始,然后在此模板中为url元素<xsl:template match="/">执行 xsl:for-each 。但此时,urlset元素将成为直接子元素。尝试将初始模板匹配更改为此

<xsl:template match="/sm:urlset">

然后,您的xsl:for-each应该会找到一些东西。

当然,可能还有其他问题。首先,您需要确保使用 PHP 输出的 XML 格式正确。

于 2013-11-08T18:16:42.523 回答