Это продолжение этого вопроса .
У меня есть несколько <span>
тегов в документе с несколькими разделенными точкой с запятой атрибутами стиля. Прямо сейчас у меня есть 3 специфических атрибута стиля, которые я хочу перевести в теги. Все работает хорошо в приведенном выше примере, если атрибут style содержит только один из трех атрибутов style. Если диапазон имеет больше, я получаю неоднозначное совпадение правил.
Три атрибута стиля, которые я ищу, это font-style:italic
, font-weight:600
и text-decoration:underline
, которые следует удалить из атрибута стиля и преобразовать в <em>
, <strong>
и <u>
соответственно .
Вот мой текущий XSLT:
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="span[
contains(translate(@style, ' ', ''), 'font-style:italic')
]">
<xsl:copy>
<xsl:attribute name="style">
<xsl:value-of select="substring-before(@style, ' font-style')"/>
<xsl:value-of select="substring-after(@style, 'italic;')"/>
</xsl:attribute>
<em>
<xsl:apply-templates select="node()"/>
</em>
</xsl:copy>
</xsl:template>
<xsl:template match="span[
contains(translate(@style, ' ', ''), 'font-weight:600')
]">
<xsl:copy>
<xsl:attribute name="style">
<xsl:value-of select="substring-before(@style, ' font-weight')"/>
<xsl:value-of select="substring-after(@style, '600;')"/>
</xsl:attribute>
<strong>
<xsl:apply-templates select="node()"/>
</strong>
</xsl:copy>
</xsl:template>
<xsl:template match="span[
contains(translate(@style, ' ', ''), 'text-decoration:underline')
]">
<xsl:copy>
<xsl:attribute name="style">
<xsl:value-of select="substring-before(@style, ' text-decoration')"/>
<xsl:value-of select="substring-after(@style, 'underline;')"/>
</xsl:attribute>
<u>
<xsl:apply-templates select="node()"/>
</u>
</xsl:copy>
</xsl:template>
То, что будет генерировать неоднозначное предупреждение о правиле, не будет работать правильно для некоторых элементов, которые содержат более одного из перечисленных атрибутов.
Пример ввода:
<span style=" text-decoration: underline; font-weight:600; color:#555555">some text</span>
преобразуется в:
<span style=" font-weight:600; color:#555555"><u>some text</u></span>
когда желаемый результат:
<span style="color:#555555"><b><u>some text</u></b></span>
Как я могу исправить неоднозначное соответствие правила для этого?
Заранее спасибо
Обновление:
Если для каждого из шаблонов установить priorty
в нисходящие значения и снова запустить XSLT на выходе первого запуска XSLT, все будет работать как положено. Должен быть более простой способ, чем дважды выполнить его через преобразование. Есть идеи?
Как предложили Алехандро и Томалак, замена атрибутов style
атрибутом class
для классов CSS также является опцией.