【问题标题】:Use XSLT to read from one HTML source and create a new HTML page?使用 XSLT 从一个 HTML 源读取并创建一个新的 HTML 页面?
【发布时间】:2011-06-20 09:54:23
【问题描述】:

我正在尝试学习如何使用 XSLT 从一个 HTML 源中读取并创建一个新的 HTML 页面。我知道一些关于使用 XSLT 从 XML 文件中读取并创建新的 HTML 页面的知识,但另一种方法对我来说是新的,我找不到任何关于该主题的有用教程。

我正在寻找一些关于这方面的基本知识以便能够开始,但我不知道如何思考和使用 XSLT 例如从源 HTML 中选择 div 及其内容并创建一个新的 HTML 并可能创建一个没有head标签的新页面等等。

请提供有关此主题的一些基本帮助或良好链接。谢谢! :)

你好!这是我的任务和问题,如果可能的话,我需要一些帮助来解决?!我有一个使用 CSS 样式表的 XHTML 文档。我们将 XHTML 文档称为“B”。我想创建一个新的 XHTML 文档,我们称之为“A”,并使用“A”上的“B”中的一些 div 和新的 CSS 样式表。这就像如果有人点击“B”,他们会来到“A”。嗯,我不知道从哪里开始,我不知道这是否可能?如何将 CSS 样式表添加到 XSLT 代码?也许没有人明白我在说什么,但不要犹豫问。感谢我能得到的所有帮助来解决这个任务!提前致谢! :)

【问题讨论】:

  • XSLT 只能使用格式良好的 XML。所以第一步总是将您的 HTML 转换为 XHTML。 tidy 之类的工具可以为您做到这一点。
  • 这必须在浏览器端运行时动态完成?

标签: xslt


【解决方案1】:

当从 XHTML 转换为 (X)HTML 时,从处理器的角度来看,您可能希望首先避免由 doctype 引起的解析阶段的外部解析,因为它可能是运行时错误的来源。

在这种情况下,您应该查看您的处理器是否支持禁用该选项的任何选项,或者您可能需要直接从输入文档中删除 doctype 声明。

例如,在 msxsl 中,您可以使用 xe 选项来禁用外部文档类型解析:

> msxsl test_i.xml test_t.xsl -o test_o.xml -xe

XSLT 1.0 的角度来看,您的 xhtml 只是具有特定名称空间的 XML 文档。例如:

<?xml version="1.0"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title></title>
    </head>
    <body>
        <p>Foo</p>
    </body>
</html>

要能够将其转换为其他 XHTML 文档,您的 XSLT 必须:

  • 声明正确的默认命名空间和前缀
  • 声明正确的输出和文档类型

您将使用定义的前缀访问输入文档中的元素。例如,这个转换只是在输入文档中添加一个标题:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:x="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="x">

    <xsl:output method="html" indent="yes" 
        doctype-public="-//W3C//DTD XHTML 1.1//EN" 
        doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

    <xsl:strip-space elements="*"/>

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

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

</xsl:stylesheet>

注意:

  • 命名空间前缀xmlns:x="http://www.w3.org/1999/xhtml"的声明允许您正确选择输入文档中符合xhtml命名空间的元素。
  • 默认命名空间 xmlns="http://www.w3.org/1999/html" 的声明可防止在输出文档中生成不需要的空命名空间 xmlns=""
  • exclude-result-prefixes 的使用允许您在 XSLT 中明确声明的输出文档元素中排除 xhtml 命名空间的声明。

XSLT 2.0 的角度来看,它确实非常简单。您可以声明 XPath 默认命名空间,从而摆脱前缀。样式表声明将是:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns="http://www.w3.org/1999/xhtml"
    xpath-default-namespace="http://www.w3.org/1999/xhtml">

【讨论】:

  • 感谢详细的解释!这段代码是否必要:xmlns:x="w3.org/1999/xhtml" exclude-result-prefixes="x"> match="node()|@*"> 行做什么?
  • @user:我已经扩展了我的答案的 XSLT 1.0 部分,以更好地解释命名空间。您所指的模板称为 identity rule,您会在 SO 中找到很多示例来解释其含义。
  • 如何运行上面的代码并查看输出结果?
  • 我的任务是使用 XSLT 删除一些不需要的 DIV,并为来自外部 XHTML 文档的一些 DIV 添加新样式。这真的是正确的方法吗?用 XSLT “重建” XHTML 文档的意义何在?我只是想向给我任务的人提供一些东西。
  • 请考虑发布新问题 :)
【解决方案2】:

欢迎使用 Stackoverflow!

您可能处于以下两种情况之一:

  • 您的 HTML 文件实际上是一个 XHTML 文件 - 在这种情况下,没有任何变化! HTML 只是一种特定类型的 XML,您可以使用所有常规技术来处理它。从 XSLT 的角度来看,HTML 输入没有什么特别之处:学习 XSLT,您就可以将其应用到 HTML 中(当然,请随时在这里提出具体问题!)
  • 您的 HTML 文件不是 XHTML,无法被 xml 解析器解析。在这种情况下,您需要将语法转换为 XML,或者使用解析器将 HTML 表示为 XML 树。 HTML Tidy 可以将 HTML 转换为 XHTML(它有多种形式),例如 HTML Agility Pack 可以解析 HTML 并将其表示为 XML(请注意,HTML 敏捷包不支持 xml 命名空间,所以如果你有任何那些在你输入的,你需要先删除它们)。

【讨论】:

  • 嗯,谢谢!源文件是一个 XHTML 文件,所以可能没那么难。
  • 因此,如果我有一个带有
    的 XHTML 文档,那将是 在 XSLT 中显示
    中的内容 ??我想对了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2021-01-13
相关资源
最近更新 更多