Je veux ajouter des acronymes à un texte HTML en utilisant xslt: analyze-string. Le problème: dans mon texte HTML sont des balises telles queUtiliser xslt: analyze-string pour ajouter des acronymes au HTML
<strong>some text</strong>
qui sont traités comme des noeuds XML. Quand j'applique xslt: analyze-string, ces nœuds sont convertis en chaînes - les balises sont supprimées. De même, dans ma feuille de style XSLT récursive, les acronymes déjà insérés sont également supprimés.
Ma question: y a-t-il un truc pour empêcher xslt: analyse-chaîne de transformer les nœuds HTML en chaînes et préserver les balises HTML?
Voici mon exemple:
Stylesheet:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xhtml" >
<xsl:template match="/">
<div>
<xsl:call-template name="insert-acronyms">
<xsl:with-param name="text" select="/doc/div"/>
<xsl:with-param name="acronyms" select="/doc/dictionary/acronym"/>
</xsl:call-template>
</div>
</xsl:template>
<xsl:template name="insert-acronyms">
<xsl:param name="text" as="node()*"/>
<xsl:param name="acronyms"/>
<xsl:choose>
<xsl:when test="$acronyms">
<xsl:call-template name="insert-acronyms">
<xsl:with-param name="acronyms" select="$acronyms[position() > 1]"/>
<xsl:with-param name="text">
<xsl:call-template name="replace-words">
<xsl:with-param name="text" select="$text"/>
<xsl:with-param name="name" select="$acronyms[1]/name"/>
<xsl:with-param name="description" select="$acronyms[1]/description"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="replace-words">
<xsl:param name="text" />
<xsl:param name="name" />
<xsl:param name="description" />
<xsl:analyze-string select="$text" regex="{concat('(^|\W)(', string-join($name, '|'), ')(\W|$)')}">
<xsl:matching-substring>
<xsl:value-of select="regex-group(1)"/>
<xsl:element name="acronym">
<xsl:attribute name="title"><xsl:value-of select="$description"/></xsl:attribute>
<xsl:value-of select="regex-group(2)"/>
</xsl:element>
<xsl:value-of select="regex-group(3)"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>
Source:
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<dictionary>
<acronym>
<name>WWW</name>
<description>The World Wide Web</description>
</acronym>
<acronym>
<name>HTML</name>
<description>The HyperText Markup Language</description>
</acronym>
</dictionary>
<div>
<p>In the <strong>WWW</strong> you can find a lot of <em>HTML</em> documents.</p>
</div>
</doc>
Résultat de la transformation (strong et em-tags sont dépouillés loin, un seul acronyme est inséré parce que l'autre est également dépouillé):
<?xml version="1.0" encoding="UTF-8"?>
<div> In the WWW you can find a lot of <acronym title="The HyperText Markup Language">HTML</acronym> documents. </div>
Bonne question, +1. Voyez ma réponse indiquant les problèmes dans le code fourni et pour une solution beaucoup plus simple et non récursive. :) –