我需要将一个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, '<')">
<xsl:value-of select="substring-before($text, '<')"/>
<xsl:call-template name="remove-html">
<xsl:with-param name="text" select="substring-after($text, '>')"/>
</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>
我该怎么做?
答案 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>
。在这种情况下,模板已经从标签上剥离(如上所述),并且实际上根本不会做任何事情,但返回它作为参数传递的相同字符串。恕我直言,你根本不需要这个模板。