2012-01-27 7 views
4

У меня есть неизвестное содержание приходя в качестве описания, может быть что-то вроде этого:Удаление ненужных тегов с XSL

<description> 
    <p> 
    <span> 
     <font>Hello</font> 
    </span> 
    World! 
    <a href="/index">Home</a> 
    </p> 
</description> 

Там может быть любой мыслимой HTML тегов. Мне не нужны все теги. Теги, которые я хочу разрешить, это p, i, em, strong, b, ol, ul, li и a. Так, например, < font> был бы лишен, но < p> и < a> остался бы. Я предполагаю, что должен соответствовать тем, которые я хочу (и убедиться, что нет ничего, чтобы соответствовать другим), но не может решить, как это сделать.

Любая помощь?

ответ

7

Whitelist эти элементы:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="*[not(self::description or self::p or self::i or 
           self::em or self::strong or self::b or 
           self::ol or self::ul or self::li or self::a)]"/> 
</xsl:stylesheet> 

Обратите внимание, что это удаляет нежелательные элементы и все, что ниже них. Чтобы просто раздеться сам font элемент, например, но позволяют своим детям, изменять последний шаблон:

<xsl:template match="*[not(self::description or self::p or self::i or 
          self::em or self::strong or self::b or 
          self::ol or self::ul or self::li or self::a)]"/> 
    <xsl:apply-templates/> 
</xsl:template> 

равновеликой (и немного чище) решение:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:template match="@*|node()" priority="-3"> 
     <xsl:copy/> 
    </xsl:template> 
    <xsl:template match="description|p|i|em|strong|b|ol|ul|li|a"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="*"/> 
</xsl:stylesheet> 

Противоположный подход в черный список нежелательных элементов:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="font|span"/> 
</xsl:stylesheet> 

Опять же, добавить apply-templates к окончательный шаблон, если вы хотите разрешить детям пропущенных элементов.

+2

+1 хороший ответ. Вы можете упростить белый список ... Измените атрибут соответствия вашего шаблона соответствия '' description | p | i | ... "'. Затем измените атрибут соответствия пустого шаблона на '' * "', с 'priority =" - 3 "', чтобы убедиться, что он занимает заднее сиденье. – LarsH

+1

@LarsH - Я просто обновлялся, чтобы показать это как альтернативу :) Не знаю, почему я изначально не делал этого. –

+0

@LarsH - закончилось немного отличающимся от предложенного, потому что это фактически шаблон Identity, который должен занять заднее сиденье. –

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