XHTML 到 XML XSLT 的转换

Posted

技术标签:

【中文标题】XHTML 到 XML XSLT 的转换【英文标题】:XHTML to XML XSLT conversion 【发布时间】:2011-12-16 18:05:03 【问题描述】:

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

但在我看来,起点对我来说并不是那么简单。我的第一个目标是将<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 页面的内容完全一样,看来我写的第三个模板匹配(匹配&lt;html&gt; 标签)永远不会被命中。

源 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>

专家能帮我一下吗?

【问题讨论】:

你能举一个你的html的例子吗? (尤其是像 xmlns="http://www.w3.org/1999/xhtml" 这样的命名空间) @DevNull,我用源 html 更新了我的问题 谢谢。好问题 +1 【参考方案1】:

XSLT 1.0:

尝试将xmlns:x="http://www.w3.org/1999/xhtml" 添加到您的xsl:stylesheet 并将匹配更改为match="x:html"。 (注意:你不必使用“x”;你可以选择任何你想要的。)

XSLT 2.0:

要么使用上述方法,要么将匹配项中的命名空间前缀替换为“*”(match="*:html")。您也可以将xpath-default-namespace="http://www.w3.org/1999/xhtml" 添加到xsl:stylesheet

【讨论】:

谢谢,成功了!是的,html 实际上是 xhtml,我使用的是 XSLT1.0,在放入您建议的命名空间后,效果很好:) 我更新了标题以反映源文档的性质。 @Kevin - 不客气。此外,如果您不想在 XML 输出中使用名称空间,请将 exclude-result-prefixes="#all" 添加到 xsl:stylesheet。 (注意:您可以将#all 替换为x 以专门排除x【参考方案2】:

XSLT 的目的是将XML 文档转换为其他XML 文档。 HTML 不是 XML 文档。虽然 XHTML 是 XML,但它实际上是重新编写的 HTML,所以我只是不确定您想要使用 XSLT 做的事情是否容易或可能。

【讨论】:

所以现在你更新标题:)。这反映了我的问题。【参考方案3】:

您可能想尝试删除第一个模板或使其更具体,而不是将每个节点与node() 匹配。

【讨论】:

你是说删除身份转换吗? @lkuty,我确实尝试删除第一个模板。现在生成的 xml 只是一个没有任何标记的大文本节点。它包含原始 html 页面中的所有文本。 我错了。我认为可以选择第一个规则而不是第三个规则,但实际上带有元素的匹配模式的默认优先级大于node(),因此这不是问题。我只是没想到 NS。

以上是关于XHTML 到 XML XSLT 的转换的主要内容,如果未能解决你的问题,请参考以下文章

XSLT

JavaEE XML XSL转换(XSLT)

XSLT学习通过JavaScript转化xml

使用 XSLT 将 XML 转换为 XML(添加、删除、修改)

XSLT简介

需要使用 XSLT 将 4 个 xml 文件组合成一个 xhtml