我有一个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>
仍然在输出中。
有关如何使用重氮规则摆脱空元素的任何提示?
更新 2012年1月31日
以下是我需要删除空的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>
重氮转型规则:
<?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网站后得到的输出与输入完全相同,而我打算在打开<p>
之后获得这3个空的<div>
标记。
如果我更改第二个模板以匹配match="*…
等所有元素,则图片会被删除,但空的<p>
标记仍然存在。
答案 0 :(得分:3)
刚刚拥有:
<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>
答案 1 :(得分:2)
适合我。我添加了一个在https://github.com/plone/diazo/commit/94ddff7117d25d3a8a89457eeb272b5500ec21c5的放置内容规则中使用Dimitre的xpath的示例,但它也可以作为等效的xsl:template。这个例子很简单,但它也可以使用问题中的完整示例内容。