修改“动态”门户列内容标记的类

时间:2012-06-04 11:06:21

标签: xslt plone diazo

我需要在portal-column-content标签中“动态”修改一个类名,这是呈现的html代码:

<div id="portal-column-content" class="cell width-9 position-1:4">

我想只用“width-12”替换“width-9” 有什么建议吗? 感谢的
维托

3 个答案:

答案 0 :(得分:2)

既然你要求建议,这里有一些:

  1. 不要使用css类来表示任何具体内容,让它表示意图。 意图的具体实现在css中。例如,不要创建名为width-9的类,而是创建一个名为portal-column-content的类。然后,您可以将portal-column-content设为width:9pxwidth:12em或其他任何内容。

  2. 像这样做一个字符串替换不是你用xslt做的事情。 即使你可以。根据您的设置,还有其他更好的方法。

  3. 如果您不能/不会遵循上述任何建议,请尝试

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="@class">
            <xsl:attribute name="class">
            <xsl:value-of select="substring-before(.,'width-9')"/>width-12<xsl:value-of select="substring-after(.,'width-9')"/>
            </xsl:attribute>
        </xsl:template>
    </xsl:stylesheet>
    

答案 1 :(得分:1)

此XSLT 1.0转换

<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="div[@id='portal-column-content']/@class">
  <xsl:attribute name="class">
   <xsl:value-of select=
    "substring-before(concat(.,'width-9'), 'width-9')"/>
   <xsl:value-of select="'width-12'"/>
   <xsl:value-of select="substring-after(., 'width-9')"/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

应用于以下示例XML文档时:

<html>
    <div id="a" class="a"/>
    <div id="b" class="b"/>
    <div id="c" class="cell width-9 position-1:4"/>
    <div id="portal-column-content" class="cell width-9 position-1:4"/>
    <div id="d" class="d"/>
    <div id="e" class="cell width-9 position-1:4"/>
</html>

生成所需的正确结果替换为'width-9'任何具有{{1的div的class属性的子字符串字符串值id的属性:

'portal-column-content'

请注意

  1. 仅替换是具有<html> <div id="a" class="a"></div> <div id="b" class="b"></div> <div id="c" class="cell width-9 position-1:4"></div> <div id="portal-column-content" class="cell width-12 position-1:4"></div> <div id="d" class="d"></div> <div id="e" class="cell width-9 position-1:4"></div> </html> 属性且字符串值为'width-9'的任何div的class属性的id子字符串。具有不同'portal-column-content'属性的其他div元素不受影响。

  2. 转换正确地适用于id属性,其字符串值不包含class - 与其他答案进行比较,在这种情况下其XSLT解决方案完全替换了字符串值带有'width-9'的{​​{1}}属性。

答案 2 :(得分:0)

由于您使用“diazo”标记了这一点,因此最简单的解决方案可能是使用重氮规则。只需在规则之前或之后使用替换,将#portal-column-content的内容子项复制到正确分类的#portal-column-content的主题子项。

如果要选择性地使用“if”表达式,请使用