2013-12-11 2 views
0

У меня есть требование импортировать html-сайт на Drupal, и я решил использовать модуль Import HTML для этого.Импорт HTML-модуля Drupal с пользовательским шаблоном XSL

Я должен быть в состоянии захватить только текст с 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> 

теперь требование является только получить: Главной Приложения Middleware

Я нашел, что это удалить 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> 

Как я могу это сделать?

ответ

0

Я не совсем понял, как Drupal называет ваш XSLT, но предположим, что это простой процессор XSLT 1.0, используя некоторую HTML-страницу в качестве входных данных и генерирующий вывод, который вы показали выше. Предположим далее, что исходный HTML хорошо сформирован со всеми необходимыми закрывающими тегами, так что это фактически XHTML, который может обрабатываться процессором XSLT. (Это неверно для HTML, который вы включили в свой вопрос, между прочим.)

Так что вы хотите, чтобы в основном не отображались все теги в XML/XHTML-входе. Я думаю, что самый простой способ достичь этого - использовать тег <xsl:value-of select>. Предполагая, что вы копируете все дочерние теги в <body></body> разделе вашего XHTML, как это:

<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>.В этом случае шаблон уже будет удален с тегов (как описано выше) и фактически ничего не сделает, а вернет ту же строку, что и в качестве параметра. Так что ИМХО, вам не понадобится этот шаблон вообще.

Смежные вопросы