2011-01-19 117 views
1

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

任何帮助将在这里得到真正的理解,因为我就是” W图出什么错误

这里的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命名空间,金银丝联合命名空间和NHS选择命名空间只有NHS选择命名空间实际使用前缀不过,这就是困惑我真的,我怎么会宣布其他命名空间?我甚至不需要?

这里是我的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的例子采取这样的道歉,如果这是光秃秃的。

任何想法我需要做的,使这项工作?

感谢, 科林

回答

4

所有的XSLT首先并不是在所有有效(ulxsl:template无效XSL)。

进一步,因为在你的feed标签的默认命名空间,你也有你的XSLT来定义这个。您还最好使用CSLT中for-each循环的mathcing模板intead。

<?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> 
+0

太感谢你了,就像一个魅力!所以通过在XSL中为feed名称空间定义前缀,它将起作用,这让我感到困惑,因为在XML中没有前缀。感谢您向我展示光:) – 2011-01-19 13:32:58