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



我需要将一个html网站导入Drupal,我决定使用导入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>

我该怎么做?

我不太熟悉Drupal调用XSLT的方式,但假设它是一个简单的XSLT1.0处理器,使用一些HTML页面作为输入并生成上面显示的输出。让我们进一步假设原始HTML格式良好,包含所有必需的结束标记,因此它实际上是XHTML,可以由XSLT处理器进行处理。(顺便说一句,你的问题中包含的HTML不是这样的。)

因此,您想要做的基本上是防止XML/XTML输入中的所有标记显示在输出中。我认为实现这一点的最简单方法是使用<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节点集,但它必须已经是字符串。因此,这适用于在字符串中具有文本XML表示的其他上下文。如果您尝试在此处使用它,则必须事先使用例如<xsl:value-of>将XML表示形式显式转换为字符串。在这种情况下,模板将已经从标签中剥离(如上所述),并且实际上根本不做任何事情,而是返回作为参数传递的相同字符串。所以IMHO,你根本不需要这个模板。

最新更新