【问题标题】:First use of XSLT: page shows blank第一次使用 XSLT:页面显示空白
【发布时间】:2014-04-23 07:41:06
【问题描述】:

我正在使用此页面作为指南尝试 XSLT: http://www.w3schools.com/xml/xml_xsl.asp

我基本上尝试修改给定的 XSL 信息以适合我的标签,这些标签恰好是站点地图的形式。但是,当我将 XSL 样式应用到我的 XML 页面时,它显示为空白!显然我错过/忘记或没有看到某些东西。请帮忙。

我的 XML(仅限 sn-p):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl" ?>
<!-- sitemap-generator-url="http://www.auditmypc.com/free-sitemap-generator.asp" -->
<!-- This sitemap was created using the free tool found here: http://www.auditmypc.com/free-sitemap-generator.asp -->
<!-- Audit My PC also offers free security tools to help keep you safe during internet travels -->
<urlset 
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
>
<url>
<loc>http://www.site.com/</loc>
<lastmod>2014-03-17T13:30:25-05:00</lastmod>
</url>
<url>
<loc>http://www.site.com/index.php?format=feed&#x26;type=rss</loc>
<lastmod>2014-03-17T13:28:20-05:00</lastmod>
</url>
</urlset>

我的 XSL:

<?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">

<xsl:for-each select="urlset/url">
<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold"><xsl:value-of select="loc"/></span>
</div>

<div style="margin-left:20px;margin-bottom:1em;font-size:10pt">
<span>Last Modified:<xsl:value-of select="lastmod"/></span>
</div>
</xsl:for-each>

</body>
</html>

感谢您的帮助!

【问题讨论】:

    标签: html xml xslt sitemap


    【解决方案1】:

    请记住,XPath(以及因此 XSLT)是命名空间感知的,但是(至少在这些标准的 1.0 版本中)没有默认命名空间 (xmlns=) 分配的概念。如果要选择命名空间节点,您的 XPath 必须使用绑定到正确命名空间的显式前缀。

    【讨论】:

    • 感谢您的回复。但是,我是 XSL 的新手......如果我使用命名空间,请帮助我更好地了解如何访问数据节点。我可以做一些事情,比如从我的 xsl 文件中省略 xmlns,然后它应该可以工作吗?我很抱歉,但我确实复制了这个例子并稍微调整了一下,所以我可能没有背景信息来充分理解你的答案。
    【解决方案2】:

    您的示例 XML 文档中的 urlset 元素及其后代都在 http://www.sitemaps.org/schemas/sitemap/0.9 命名空间中,因此为了将它们与 XPath 表达式匹配,您必须将前缀绑定到该命名空间并一致地使用它:

    <?xml version="1.0" encoding="UTF-8"?>
    <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
          xmlns:sm="http://www.sitemaps.org/schemas/sitemap/0.9">
      <body style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
    
        <xsl:for-each select="sm:urlset/sm:url">
          <div style="background-color:teal;color:white;padding:4px">
            <span style="font-weight:bold"><xsl:value-of select="sm:loc"/></span>
          </div>
    
          <div style="margin-left:20px;margin-bottom:1em;font-size:10pt">
            <span>Last Modified:<xsl:value-of select="sm:lastmod"/></span>
          </div>
        </xsl:for-each>
    
      </body>
    </html>
    

    在 XSLT/XPath 1.0 中,不带前缀的元素名称​​总是 表示没有命名空间中的元素,带前缀的名称从 样式表 中获取命名空间绑定,而不是来自输入 XML。

    顺便说一句,如果您正在编写 XSLT 以在客户端由浏览器解释,那么您将被限制为 XSLT 1.0,因此我建议您找到一个好的 1.0 特定教程和参考指南。 w3schools 上的材料并不总是清楚它所指的 XSLT/XPath 版本,如果你继续尝试不起作用的东西,你会感到沮丧,只是发现它们是 2.0-only 构造...

    【讨论】:

    • 这是有道理的。基本上,因为我在我的 XML 文件中声明了该名称空间,所以在谈到节点时我还需要引用它,否则我无法知道我所说的节点是什么。我尝试了此修复程序,它立即生效,谢谢!
    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多