我的xml站点地图的xsl转换无法使用php

时间:2013-04-13 14:53:15

标签: php html xml xslt sitemap

我有一个简单的sitemap.xml文件:

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>"home page link"/</loc>
        <title>East Randolph Cabinet Shop</title>
        <level>level-1</level>
    </url>
    .
    .
    .
    </urlset>

然后我有我的sitemap.xsl文件:

    <?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="/">
     <h2>Sitemap</h2>
     <ul>
     <xsl:for-each select="urlset/url">
      <li class="&lt;xsl:value-of select=&quot;level&quot;/&gt;"><a href="&lt;xsl:value-of select=&quot;loc&quot;/&gt;"><xsl:value-of select="title"/></a></li>
     </xsl:for-each>
    </ul>
    </xsl:template>

    </xsl:stylesheet>

然后我的sitemap.php文件中的代码应该使用xsl文件转换xml文件,然后回显结果:

<div id="content">
<?php
$xml = new DOMDocument;
$xml->load('sitemap.xml');
$xsl = new DOMDocument;
$xsl->load('sitemap.xsl');
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
echo $proc->transformToXML($xml);
?>

</div>

当我将浏览器定向到sitemap.php文件时,所有回显的信息都会显示在Sitemap标题<h2>Sitemap</h2>之前。我对xsl很新,请原谅我的无知,但这对我来说,我的xsl for-each语句出了问题。我对么?我只是坚持这个。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我可以看到您的XSL文件存在两个问题。

  1. 您没有为站点地图文件使用正确的XML命名空间。
  2. 您不了解属性值模板。
  3. 以下内容应该有效:

    <xsl:stylesheet
        version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
    
    <xsl:template match="/">
        <h2>Sitemap</h2>
        <ul>
            <xsl:for-each select="sm:urlset/sm:url">
                <li class="{sm:level}">
                    <a href="{sm:loc}"><xsl:value-of select="sm:title"/></a>
                </li>
            </xsl:for-each>
        </ul>
    </xsl:template>
    
    </xsl:stylesheet>
    

    请注意站点地图XML命名空间的sm前缀和属性值模板。