我需要在 portal-column-content 标记中“即时”修改一个类名,这是呈现的 html 代码:
<div id="portal-column-content" class="cell width-9 position-1:4">
我只想用“width-12”替换“width-9”。
有什么建议吗?
谢谢维托
_
既然你征求意见,这里有一些:
不要使用 css 类来表示任何具体的东西,让它表示意图。
意图的具体实现来自 css。例如,不要创建一个名为的类width-9
,而是创建一个名为的类portal-column-content
。然后你可以做portal-column-content
be width:9px
,width:12em
或者其他什么。
用 xslt 做这样的字符串替换并不是真正的事情。 即使你可以。根据您的设置,还有其他更好的方法。
如果您不能/不会遵循上述任何建议,请尝试
<?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>
这个 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>
产生想要的、正确的结果(仅替换的是具有字符串值属性的任何 div'width-9'
的属性的子字符串:class
id
'portal-column-content'
<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>
请注意:
唯一被替换的是任何具有字符串 value属性的 div'width-9'
的属性的子字符串。具有不同属性的其他元素不受影响。class
id
'portal-column-content'
div
id
转换正确地适用于class
属性,其字符串值不包含'width-9'
-- 与另一个答案进行比较,在这种情况下,其 XSLT 解决方案将class
属性的字符串值完全替换为'width-12'
.
由于您已将其标记为“重氮”,因此最简单的解决方案可能是使用重氮规则。只需在规则之前或之后使用替换将#portal-column-content 的内容子项复制到正确分类的#portal-column-content 的主题子项。
如果要选择性地完成,请使用“if”表达式。