J'espère que quelqu'un pourra me donner un coup de main. Cela fait plusieurs jours que je suis confronté à ce problème. La racine de mon problème est que je veux ajouter du balisage à tous les noeuds dans l'ordre du document entre 2 éléments.
J'ai un document qui contient un XML similaire à celui-ci :
<Employees>
<Employee>
<Title>Mr.</Title>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Employee>
<Employee>
<Title>Mr.</Title>
<FirstName>Tom</FirstName>
<LastName>Doe</LastName>
</Employee>
</Employees>
Lorsque j'utilise la fonction "markup" d'Oracle, qui marque les résultats de recherche, et que je recherche la chaîne "John Doe", j'obtiens un résultat XML comme celui-ci :
<Employees>
<Employee>
<Title>Mr.</Title>
<FirstName><hitStart/>John</FirstName>
<LastName>Doe<hitEnd/></LastName>
</Employee>
<Employee>
<Title>Mr.</Title>
<FirstName>Tom</FirstName>
<LastName>Doe</LastName>
</Employee>
</Employees>
Je veux transformer cela en XHTML qui met en évidence le hit. Par exemple, le XHTML suivant serait un résultat utile :
<TABLE>
<TR>
<TD>Mr. <b style="color:red">John Doe</b></TD>
<TR>
<TR>
<TD>Tom Doe</TD>
</TR>
</TABLE>
J'ai essayé d'écrire des feuilles de style qui utilisent des apply-templates ou des named templates pour naviguer dans le document, mais je n'arrive pas à les faire fonctionner. L'utilisation de apply-templates est délicate car je ne peux pas passer un paramètre qui indique si les nœuds se trouvent ou non dans les éléments hitStart et hitEnd. L'utilisation de named templates est délicate car je dois traiter différemment les nœuds de texte et d'élément, ce que je ne peux pas faire avec XSLT 1.0. Une aide serait appréciée.
Merci, Brian
Merci à tous ceux qui ont aidé !!!! Vous êtes géniaux !
Voici ce que j'ai décidé :
<xsl:template match="/*|node()">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()[1]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="text()[preceding::*[self::hitStart or self::hitEnd][1][self::hitStart]
and following::*[self::hitStart or self::hitEnd][1][self::hitEnd]]">
<span style="color:red;font-style:italic;font-weight:bold"><xsl:value-of select="."/></span>
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>
<xsl:template match="hitStart|hitEnd">
<xsl:apply-templates select="following-sibling::node()[1]"/>
</xsl:template>