我正在处理应用于 HTML 文档的 XSL 转换。相关 HTML 示例:
<div class="row home-row">
<p>Hello</p>
</div>
我选择与以下 XSL 匹配的项目(运行良好):
<xsl:template match="//*[contains(concat(' ', normalize-space(@class), ' '), ' row ')]" priority="1">
然后,如果我之前检查过的条件匹配,我将“row”替换为“row-fluid”,如下所示:
<xsl:variable name="original-row-class" select="string(@class)" />
<xsl:variable name="row-class">
<xsl:call-template name="replace">
<xsl:with-param name="text" select="$original-row-class" />
<xsl:with-param name="replace" select="' row '" />
<xsl:with-param name="by" select="' row-fluid '" />
</xsl:call-template>
</xsl:variable>
<xsl:copy>
<xsl:attribute name="class"><xsl:value-of select="$row-class" /></xsl:attribute>
<xsl:apply-templates select="@*[local-name() != 'class']|node()[local-name() != 'class']"/>
</xsl:copy>
这也很有效,除了它将所有提到的“row”替换为“row-fluid”,即使它们在“home-row”内。我想做的是将“行”类更改为“行流体”,但这样做时忽略“主行”类。这可能吗?
我应该提到我被锁定在 XSLT 1.0 中。
更新:在下面添加替换模板(早该想到的!):
<xsl:template name="replace">
<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
<xsl:choose>
<xsl:when test="contains($text, $replace)">
<xsl:value-of select="substring-before($text,$replace)" />
<xsl:value-of select="$by" />
<xsl:call-template name="replace">
<xsl:with-param name="text" select="substring-after($text,$replace)" />
<xsl:with-param name="replace" select="$replace" />
<xsl:with-param name="by" select="$by" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
谢谢,乔纳森