Удаление пустых тегов с контента Plone с помощью Diazo - PullRequest
6 голосов
/ 31 января 2012

У меня есть сайт Plone, тематический с plone.app.theming.У меня проблема в том, что дизайн довольно строгий и не предполагает пустых элементов <p> или каких-либо других бессмысленных выходных данных TinyMCE.Такие элементы нарушают задуманный дизайн.Поэтому я хочу убрать пустые элементы из контента.Я пробовал встроенный xslt (который, согласно http://diazo.org/advanced.html#inline-xsl-directives должен поддерживаться) как:

<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[not(*) and not(text()[normalize-space()])]"/>

Но это не сработало.На самом деле это сделало что-то странное.Пустые теги p, от которых я хотел избавиться, остались без изменений, но некоторые другие элементы, такие как

<a href="mylink"> <img src="../++theme++jarn.com/whatever.png" /></a>

, превратились в

<a href="mylink"></a>

с полосатым изображением.Замена match="*[… во втором шаблоне на match="p[… не удаляла изображения, но эти неприятные <p> все еще были в выводе.

Любые подсказки о том, как избавиться от пустых элементов, используяПравила Diazo?

ОБНОВЛЕНИЕ 31 января 2012 г. Вот содержимое, из которого мне нужно удалить пустые теги p:

<div id="parent-fieldname-text">
<p></p>
<p> </p>
<p> </p>
<p><section id="what-we-do">
<p class="visualClear summary">Not empty Paragraph</p>
<ul class="thumbsList">
    <li><a href="mylink"> <img src="../++theme++jarn.com/whatever.png" /></a></li>
    <li><a href="mylink"> <img src="../++theme++jarn.com/whatever.png" /></a></li>
</ul>
</section></p>
</div>

The Diazoправила преобразования:

<?xml version="1.0" encoding="UTF-8"?>
<rules
    xmlns="http://namespaces.plone.org/diazo"
    xmlns:css="http://namespaces.plone.org/diazo/css"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="p[not(*) and not(normalize-space())]"/>

    <!-- The default theme, used for standard Plone web pages -->
    <theme href="index.html" css:if-content="#visual-portal-wrapper" />

    <replace css:theme-children="div.contentWrapper" css:content-children="#content" />            
</rules>

Вывод, который я получаю после применения преобразований к сайту Plone, абсолютно идентичен вводу, хотя я ожидаю получить эти 3 пустых тега <p> после открытия <div>, чтобы перейтипрочь.

Если я изменю второй шаблон, чтобы он соответствовал всем элементам, таким как match="*…, тогда изображения будут удалены, но пустые теги <p> все еще там.

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Просто имейте это :

<xsl:template match="p[not(*) and not(normalize-space())]"/>

Полное преобразование :

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="p[not(*) and not(normalize-space())]"/>
</xsl:stylesheet>

, когда это преобразование применяется кэтот документ XML :

<div>
 <p/>
 <p>  </p>
 <p><img src="..."/></p>
 <img src="..."/>
</div>

желаемый, правильный результат получается :

<div>
   <p>
      <img src="..."/>
   </p>
   <img src="..."/>
</div>
2 голосов
/ 31 января 2012

У меня работает. Я добавил пример использования xpath Димитра в правиле отбрасывания контента на https://github.com/plone/diazo/commit/94ddff7117d25d3a8a89457eeb272b5500ec21c5, но он также работает как эквивалентный xsl: шаблон. Пример сводится к основам, но он работает и с полным содержанием примера в вопросе.

...