2011-10-27 112 views
2

我正在做一个非常简单的xslt将html页面转换为xml文件。XHTML到XML XSLT转换

但在我看来,起点对我来说并不那么简单。我的第一个目标是将<html>标记转换为<topic>标记。

我做了以下XSLT:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="html"> 
    <topic> 
    <xsl:text> Conversion Test</xsl:text> 
    </topic> 
</xsl:template> 

不过,现在我运行这个XSLT后,结果XML是纯粹原始的HTML页面的内容相同的,好像是第三个模板匹配,我写(匹配<html>标签)永远不会被击中。

HTML源代码看起来像:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head>..</head> 
    <body>...</body> 
</html> 

专家能帮助我一点吗?

+0

你能举一个你的html的例子吗? (特别是任何命名空间像'xmlns =“http://www.w3.org/1999/xhtml”') –

+0

@DevNull,我更新了我的问题与源HTML – Kevin

+0

谢谢。好问题+1 –

回答

4

XSLT 1.0:

尝试增加xmlns:x="http://www.w3.org/1999/xhtml"xsl:stylesheet和改变你的比赛match="x:html"。 (注:你没有用“X”,你可以选择你想要的任何东西。)

XSLT 2.0:

要么用上面的方法或者在你的对手(ES更换命名空间前缀)改为“*”(match="*:html")。您还可以将xpath-default-namespace="http://www.w3.org/1999/xhtml"添加到xsl:stylesheet

+0

谢谢,它的工作!是的,这个html实际上是xhtml,我使用XSLT1.0,放入你建议的命名空间之后,效果很好:) – Kevin

+0

我更新了标题以反映源文档的性质。 – Kevin

+1

@凯文 - 你非常欢迎。另外,如果您不想在XML输出中使用名称空间,请将'exclude-result-prefixes =“#all”'添加到'xsl:stylesheet'。 (注意:你可以用'x'替换'#all'来特别排除'x'。 –

0

您可能想要尝试删除第一个模板或使其与使用node()匹配每个节点的模板更具体。

+0

你是说删除身份转换吗? –

+0

@lkuty,我尝试删除第一个模板。现在生成的XML只是一个没有任何标记的文本大节点。它包含原始html页面中的所有文本。 – Kevin

+0

我错了。我认为可以选择第一条规则,但实际上,匹配模式的默认优先级大于'node()',因此它不会成为问题。我只是没有想到NS。 – lkuty

0

XSLT的目的是将XML文档转换为其他XML文档。 HTML不是一个XML文档。虽然XHTML是XML,但它实际上是HTML重新构建的,所以我只是不确定要使用XSLT执行简单或可能的操作。

+0

所以现在你更新标题:)。这反映了我的问题。 – Rob