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>

現時点では、サイトマップ Web ページは 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 式は名前空間なしの要素を探しています。

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>

もう 1 つの問題は、ドキュメント ノードの照合から始めますが、このテンプレート内でurl要素<xsl:template match="/">に対して xsl:for-each を実行することです。しかし、この時点で、直接の子要素になるのはurlset要素です。最初のテンプレートの一致をこれに変更してみてください

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

次に、xsl:for-eachが何かを見つけるはずです。

もちろん、まだ他の問題があるかもしれません。まず、PHP で出力する XML が整形式であることを確認する必要があります。

于 2013-11-08T18:16:42.523 に答える