使用自定义XSL模板导入HTML Drupal模块

时间:2013-12-11 08:58:30

标签: html xslt drupal

我需要将一个html网站导入Drupal,我决定使用Import HTML模块来执行此操作。

我必须能够在没有html标签的情况下从html页面(内部标签)中获取文本。

为此,我正在尝试基于默认模板创建自定义xsl模板:html2simplehtml.xsl。

目前我的导入工作正常,使用html2simplehtml.xsl模板。 这是导入的结果节点主体的示例:

<div class="container-narrow">
<div class="masthead">
<ul class="nav nav-pills pull-right">
<li class="active">
<a href="/index.html">Home</a>
</li>
<li>
<a href="/apps.html">Applications</a>
</li>
<li>
<a href="/middleware.html">Middleware</a>
</li>

现在,要求只是获得:     家     应用     中间件

我发现这是为了删除html标签:

<!-- This will remove the tag -->
<xsl:template name="remove-html">
<xsl:param name="text"/>
<xsl:choose>
    <xsl:when test="contains($text, '&lt;')">
        <xsl:value-of select="substring-before($text, '&lt;')"/>
        <xsl:call-template name="remove-html">
                <xsl:with-param name="text" select="substring-after($text, '&gt;')"/>
        </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
        <xsl:value-of select="$text"/>
    </xsl:otherwise>
</xsl:choose>

但我不确定放在哪里以及如何使用它来调用它:

<!-- Calling the template that removes tag -->
<xsl:call-template name="remove-html">
    <xsl:with-param name="text" select="{HtmlBody}"/>
</xsl:call-template>

我该怎么做?

1 个答案:

答案 0 :(得分:0)

我不太熟悉Drupal调用你的XSLT的方式,但让我们假设它是一个简单的XSLT 1.0处理器,使用一些HTML页面作为输入并生成你在上面显示的输出。让我们进一步假设原始HTML是用所有必需的结束标记很好地形成的,因此它实际上是XHTML,它可以由XSLT处理器处理。 (顺便说一句,对于您在问题中包含的HTML,情况并非如此。)

所以你想要做的是基本上阻止XML / XHTML输入中的所有标签出现在输出中。我认为使用<xsl:value-of select>标记实现此目的的最简单方法。假设您复制XHTML的<body></body>部分的所有子标记,如下所示:

<xsl:template match="body">
    <xsl:copy-of select="*">
</xsl:template>

相反,你可以这样做:

<xsl:template match="body">
    <xsl:value-of select=".">
</xsl:template>

<xsl:value-of>强制将XML子树的评估转换为一个字符串,该字符串通过连接所有包含的文本元素来完成(简单地放置)。但是,这还没有照顾到空白区域。如果你想消除令人不安的空白区域,你可以像这样支持这个电话:

<xsl:template match="body">
    <xsl:value-of select="normalize-space(.)">
</xsl:template>

现在您最初想要使用的模板:这实际上也会从输入中删除标签。但是,如果我正确解释代码,则输入是 NOT XML节点集,但它必须已经是 STRING 。因此,这适用于在字符串中具有文字XML表示的其他上下文。如果您尝试在此处使用它,则必须使用以下方法将XML表示显式转换为字符串预先<xsl:value-of>。在这种情况下,模板已经从标签上剥离(如上所述),并且实际上根本不会做任何事情,但返回它作为参数传递的相同字符串。恕我直言,你根本不需要这个模板。