XML和XSLT无法协同工作

时间:2013-11-08 18:00:56

标签: xml codeigniter xslt

我无法让我的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>

对我来说似乎很好..

1 个答案:

答案 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格式正确,一开始。