Я работаю с преобразованием XSL, которое применяется к HTML-документу. Соответствующий HTML пример:В XSLT, Замените одно значение класса при наличии нескольких значений
<div class="row home-row">
<p>Hello</p>
</div>
Я выбираю элементы, которые соответствуют этим со следующим XSL (который работает хорошо):
<xsl:template match="//*[contains(concat(' ', normalize-space(@class), ' '), ' row ')]" priority="1">
Тогда, если условие Я раньше проверил матчи, я заменяю " строка»с„строка-жидкость“, как это:
<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.
Update: добавление заменить шаблон ниже (надо было думать о том, что раньше!):
<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>
Спасибо, Jonathan
Можете ли вы использовать шаблон «заменить», который вы вызываете, поскольку проблема действительно находится в коде для этого. Благодаря! –
Конечно, я должен был подумать, что это может быть так. Обновлено. –
Спасибо! Вы уверены, что показываете правильный XSLT? Просто когда вы вызываете шаблон «replace», вы передаете его «row» в качестве параметра с пробелами с обеих сторон, но вы также передаете ему исходное имя класса без пробела в начале.Это означает, что шаблон «replace» не должен на самом деле ничего заменить ... –