XSL - for-each无法正常工作

时间:2017-01-25 19:35:25

标签: html css xml xslt xslt-1.0

我有以下XML代码(test.xml):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>http://www.url.com/1/</url>
    <url>http://www.url.com/2/</url>
    <url>http://www.url.com/3/</url>
</urlset>

然后,我想用以下XSL代码(test.xsl)给它一些风格:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
    <xsl:for-each select="/urlset/url">
        <div>
            one address here (no matter which)
        </div>
    </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

由于某种原因,没有结果,只有blank page

我刚刚按照几年前试过的示例代码对我有用,但这不起作用。

关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:2)

  

我刚刚按照几年前尝试的示例代码为我工作

几年前代码工作可能是因为那时你的输入文档没有命名空间。

现在,您的输入文档有一个默认命名空间,您需要在XSLT样式表中进行说明。如果您在样式表中重新声明此命名空间,并且前缀来自输入文档的所有元素名称,则样式表可用。

我猜你可能想要以下样式表,它输出所有url元素的内容:

XSLT样式表

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:stmp="http://www.sitemaps.org/schemas/sitemap/0.9">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
    <xsl:for-each select="/stmp:urlset/stmp:url">
        <div>
            <xsl:value-of select="."/>
        </div>
    </xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

XHTML输出

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:stmp="http://www.sitemaps.org/schemas/sitemap/0.9">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
      <title>Test</title>
   </head>
   <body>
      <div>http://www.url.com/1/</div>
      <div>http://www.url.com/2/</div>
      <div>http://www.url.com/3/</div>
   </body>
</html>

但是你的XSLT编程风格也可以改进。使用xsl:for-each代替不必要的xsl:apply-templates,并为url元素编写单独的模板。

XSLT样式表(已改进)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:stmp="http://www.sitemaps.org/schemas/sitemap/0.9">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Test</title>
</head>
<body>
    <xsl:apply-templates/>
</body>
</html>
</xsl:template>

<xsl:template match="stmp:url">
    <div xmlns="http://www.w3.org/1999/xhtml">
        <xsl:value-of select="."/>
    </div>
</xsl:template>

</xsl:stylesheet>

输出结果相同。在线here自行试用。

答案 1 :(得分:-1)

这是您尝试完成的一种简单方法:

您的XML代码:

<?xml version="1.0" encoding="UTF-8"?>
  <urlset>
    <url>http://www.url.com/1/</url>  
  </urlset>

您的XSLT代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
 <xsl:template match="/">
  <html> 
   <body>
      <xsl:value-of select="urlset/url"/>
   </body>
  </html>
 </xsl:template>
</xsl:stylesheet>