XSL名称空间和xsl:for-each

时间:2011-01-19 12:48:01

标签: xslt xpath xml-namespaces

我目前无法尝试使用XSL将XML文档转换为HTML。 XML文档使用命名空间,我对XSL没有太多经验,更不用说命名空间了。基本上我想要做的就是获取s:treatment的每个实例并将其作为列表输出。我已经更改了数据,所以不要公开我正在为此做的网站。我正在使用Classic ASP(无法更新到ASP.NET)来转换服务器上的XML,因此XSL必须是版本1:(

在这里我会非常感激任何帮助,因为我无法弄清楚出了什么问题。

这是XML:

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">a</title>
<id>a</id>
<rights type="text">© Crown Copyright 2009</rights>
<updated>2011-01-19T11:23:25Z</updated>
<category term="Service"/>
<author>
 <name>c</name>
<uri>http://www.meh.com</uri>
 <email>erwt</email>
 </author>
<complete xmlns="http://purl.org/syndication/history/1.0"/>
<entry>
 <id>http://meh.com/services</id>
 <title type="text">title</title>
 <updated>2010-06-18T19:52:12+01:00</updated>
 <link rel="self" title="title" href="meh"/>
 <link rel="alternate" title="title" href="id"/>
 <content type="application/xml">
 <s:service xmlns:s="http://syndication.nhschoices.nhs.uk/services">
  <s:type code="S">h</s:type>
  <s:deliverer>j</s:deliverer>
  <s:parent>k</s:parent>
  <s:treatments>
   <s:treatment>fissure</s:treatment>
   <s:treatment>fistula</s:treatment>
   <s:treatment>liver</s:treatment>
   <s:treatment>pancreas</s:treatment>
   <s:treatment>Cirrhosis</s:treatment>
     <s:treatment>Coeliac disease</s:treatment>
   <s:treatment>Crohn's disease</s:treatment>
    <s:treatment>Diagnostic endoscopy of the stomach</s:treatment>
   <s:treatment>Diverticular problems</s:treatment>
   <s:treatment>Gastrectomy</s:treatment>
   <s:treatment>Gastroenteritis</s:treatment>
   <s:treatment>Gastroenterology</s:treatment>
   <s:treatment>Gastroesophageal reflux disease(GORD)</s:treatment>
   <s:treatment>Hepatitis</s:treatment>
   <s:treatment>Hepatitis A</s:treatment>
   <s:treatment>Hepatitis B</s:treatment>
   <s:treatment>Hepatitis C</s:treatment>
   <s:treatment>Hernia hiatus</s:treatment>
   <s:treatment>Ileostomy</s:treatment>
   <s:treatment>Irritable bowel syndrome</s:treatment>
   <s:treatment>Liver disease (alcoholic)</s:treatment>
   <s:treatment>Obesity</s:treatment>
   <s:treatment>Pancreatitis</s:treatment>
   <s:treatment>Peptic ulcer</s:treatment>
   <s:treatment>Peritonitis</s:treatment>
   <s:treatment>Primary biliary cirrhosis</s:treatment>
   <s:treatment>Surgery for haemorrhoids</s:treatment>
   <s:treatment>Therapeutic endoscopy on the stomach</s:treatment>
   <s:treatment>Ulcerative colitis</s:treatment>
  </s:treatments>
  <s:phone>020 8</s:phone>
  <s:fax>020 8</s:fax>
  <s:email>jj</s:email>
  <s:website>oiyi</s:website>
 </s:service>
</content>
 </entry>
 </feed>

正如你所看到它使用Atom命名空间,Purl syndication命名空间和NHS Choices命名空间只有NHS Choices命名空间实际上使用了前缀,这实际上让我感到困惑。我如何声明其他名称空间,我甚至需要?

这是我的XSL:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s="http://syndication.nhschoices.nhs.uk/services">
<ul>
<xsl:template match="/">

<xsl:for-each select="feed/entry/content/s:service/s:treatments/s:treatment">
<li><xsl:text></xsl:text></li>
</xsl:for-each>

</xsl:template>
 </ul>
</xsl:stylesheet>

这个XSL取自w3schools的例子,如果它是裸露的,那么道歉。

我需要做些什么才能让这项工作成功?

谢谢, 科林

1 个答案:

答案 0 :(得分:5)

首先,您的XSLT根本无效(ul以外的xsl:template无效XSL)。

此外,由于feed标记上有默认命名空间,您还需要在xslt中定义此命名空间。你最好在CSLT中使用for-each循环的数学模板。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:s="http://syndication.nhschoices.nhs.uk/services"
  xmlns:a="http://www.w3.org/2005/Atom" exclude-result-prefixes="a s">

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

 <xsl:template match="/">
  <ul>
   <xsl:apply-templates
    select="a:feed/a:entry/a:content/s:service/s:treatments/s:treatment" />
  </ul>
 </xsl:template>

 <xsl:template match="s:treatment">
  <li>
   <xsl:value-of select="." />
  </li>
 </xsl:template>
</xsl:stylesheet>