web-dev-qa-db-fra.com

Comment copier tous les nœuds enfants de tout type d'un élément de contexte de modèle

Je transforme XML en HTML en utilisant XSLT.

J'ai la structure XML suivante:

<root>
    <element>
        <subelement>
            This is some html text which should be <span class="highlight">displayed highlighted</span>.
         </subelement>
    </element>
</root>

J'utilise le modèle suivant pour la transformation:

<xsl:template name="subelement">
  <xsl:value-of select="." />
</xsl:template>

Malheureusement, je perds le <span>-Mots clés.

Existe-t-il un moyen de les conserver pour que le HTML s'affiche correctement (surligné)?

14
monty

La bonne façon d'obtenir tout le contenu du nœud correspondant actuel (nœuds de texte inclus) est:

    <xsl:template match="subelement">
       <xsl:copy-of select="node()"/>
    </xsl:template>

Cela copiera tout descendant.

33
Emiliano Poggi

Essayez d'utiliser <xsl:copy-of... au lieu de <xsl:value-of... par exemple:

<xsl:template name="subelement">
  <xsl:copy-of select="*" />
</xsl:template>

Noter la * qui arrêtera le <subelement></subelement> bits sortis dans les résultats, plutôt que d'utiliser . qui comprendra le <subelement></subelement> morceaux .

Par exemple, la feuille de style xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="root/element">
        <output>
            <xsl:apply-templates select="subelement"/>
        </output>
    </xsl:template>

    <xsl:template match="subelement">
        <xsl:copy-of select="*"/>
    </xsl:template>

</xsl:stylesheet>

lorsqu'il est appliqué à votre exemple de fichier xml, il renvoie:

<?xml version="1.0" encoding="UTF-8"?>
<output>
    <span class="highlight">displayed highlighted</span>
</output>
7
Jon Egerton

Le <xsl:value-of> la déclaration prend le contenu concaténé de tous les nœuds de texte au sein de l'élément, dans un ordre séquentiel, et ne produit aucun élément du tout.

Je recommanderais d'utiliser <xsl:apply-templates> au lieu. Lorsqu'il trouve un nœud de texte, il affichera le contenu tel quel, mais vous devrez définir un modèle de gestion des balises span pour les convertir en codes HTML. Si cette balise span IS une balise html, alors à proprement parler, vous devriez avoir des espaces de noms séparés pour votre propre structure de document et html.

0
Flynn1179