У меня есть пачки автоматически сгенерированного HTML, которые делают такие глупые вещи, как это:
<p>Hey it's <em>italic</em><em>italic</em>!</p>
И я бы хотел сократить это до:
<p>Hey it's <em>italicitalic</em>!</p>
Моя первая попытка былав соответствии с этим ...
<xsl:template match="em/preceding::em">
<xsl:value-of select="$OPEN_EM"/>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="em/following::em">
<xsl:apply-templates/>
<xsl:value-of select="$CLOSE_EM"/>
</xsl:template>
Но, очевидно, спецификация XSLT в ее грандиозной доброте запрещает использование стандартных осей XPath preceding
или following
в сопоставителях шаблонов.(И это все равно потребует некоторой настройки для обработки трех ems подряд.)
Какие-нибудь решения лучше, чем забыть об этом в XSLT и просто запустить replace('</em><em>', '')
в $ LANGUAGE_OF_CHOICE для конечного результата?Грубые требования: не следует объединять два <em>
, если они разделены чем-либо (пробелами, текстом, тегами), и, хотя им не нужно объединять их, он должен по крайней мере создавать действительный XML, если их три или более <em>
в ряд.Обработка тегов, вложенных в ems (включая другие ems), не требуется.
(И, о, я видел , как объединить элемент с помощью xslt? , что похоже, но не совсемТо же самое. XSLT 2, к сожалению, не вариант, и предлагаемые решения выглядят ужасно сложными.)